git-stash so với git-branch


92

Trong một câu hỏi trước đó về Git , Daniel Benamy đã nói về quy trình làm việc trong Git:

Tôi đang làm việc trên tổng thể và cam kết một số thứ và sau đó quyết định tôi muốn tạm dừng công việc đó. Tôi đã sao lưu một vài cam kết và sau đó phân nhánh từ trước khi bắt đầu công việc tào lao của mình.

Anh muốn khôi phục trạng thái làm việc của mình về thời điểm trước đó mà không làm mất đi những thay đổi hiện tại. Tất cả các câu trả lời xoay quanh, theo nhiều cách khác nhau, giống như

git branch -m master crap_work
git branch -m previous_master master

Làm thế nào để điều này so sánh với git stash? Tôi hơi bối rối khi cố gắng xem trường hợp sử dụng khác nhau ở đây là gì khi có vẻ như mọi thứ git stashđã được xử lý bằng cách phân nhánh…


@ Jordi Bunster : Cảm ơn, điều đó làm rõ ràng mọi thứ. Tôi đoán tôi sẽ coi "stashing" giống như một nhánh nhẹ, không tên. Vì vậy, bất cứ điều gì stash có thể làm, nhánh cũng có thể nhưng với nhiều từ hơn. Đẹp!

Câu trả lời:


109

'stash' lấy những thứ không được cam kết, " bẩn " trên bản sao làm việc của bạn và lưu trữ nó đi, để lại cho bạn một bản sao làm việc sạch sẽ.

Nó không thực sự phân nhánh ở tất cả. Sau đó, bạn có thể áp dụng kho trên đầu bất kỳ nhánh nào khác. Hoặc, kể từ Git 1.6, bạn có thể làm:

git stash branch <branchname> [<stash>]

để áp dụng kho lưu trữ trên đầu một nhánh mới, tất cả trong một lệnh.

Vì vậy, stash hoạt động tuyệt vời nếu bạn chưa phạm vào nhánh " sai ".

Nếu bạn đã cam kết, thì quy trình làm việc bạn mô tả trong câu hỏi của mình là một giải pháp thay thế tốt hơn. Và nhân tiện, bạn nói đúng: Git rất linh hoạt và với sự linh hoạt đó là chức năng chồng chéo.


1
một điều khiến tôi khó chịu ... bạn có thể viết [<stash>] thực sự trông như thế nào không! Họ đưa nó vào ký hiệu đó trong tài liệu, nhưng không rõ liệu đó phải là 1 hay @ {1} hay là gì.
Gregg Lind 17/12/09

1
Nếu bạn muốn đề cập đến một kho cụ thể "N", hãy sử dụng stash @ {N}
Jordi Bunster

9
Xem git stash listtên của các kho của bạn.
idbrii

6
Gregg, có bạn có thể: git stash save (tên kho lưu trữ của bạn). Làm cho nó hữu ích hơn nếu bạn sử dụng nó nhiều để bạn biết những gì mỗi kho lưu trữ làm. Bạn có thể sử dụng git stash show -p (tên) để hiển thị cho bạn bản vá của một kho lưu trữ.
Thomas Vander Stichele

7
ngoài ra, git stash show -uđể hiển thị sự khác biệt của kho lưu trữ so với bản sao đang hoạt động.
ken

49

Khi bạn khôi phục kho lưu trữ của mình, các thay đổi của bạn sẽ được áp dụng lại và bạn tiếp tục làm việc với mã của mình.

Để lưu trữ những thay đổi hiện tại của bạn

$ git stash save 
Saved "WIP on master: e71813e..."

Bạn cũng có thể có nhiều hơn một kho. Kho lưu trữ hoạt động giống như một ngăn xếp. Mỗi khi bạn lưu một kho mới, nó sẽ được đặt ở trên cùng của ngăn xếp.

$ git stash list
stash@{0}: WIP on master: e71813e..."

Lưu ý stash@{0}phần? Đó là ID kho của bạn. Bạn sẽ cần nó để khôi phục nó sau này. Hãy làm điều đó ngay bây giờ. ID kho thay đổi với mỗi kho bạn thực hiện. stash @ {0} đề cập đến kho lưu trữ cuối cùng bạn đã thực hiện.

Để áp dụng một kho

$ git stash apply stash@{0}

Bạn có thể nhận thấy dấu tích vẫn còn đó sau khi bạn đã áp dụng nó. Bạn có thể bỏ nó nếu bạn không cần nó nữa.

$ git stash drop stash@{0}

Hoặc, vì kho lưu trữ hoạt động giống như một ngăn xếp, bạn có thể bật ra kho lưu trữ cuối cùng mà bạn đã lưu:

$ git stash pop

Nếu bạn muốn xóa tất cả các kho lưu trữ của mình, hãy chạy lệnh 'xóa':

$ git stash clear

Rất có thể bạn không thường xuyên sử dụng kho lưu trữ. Nếu bạn chỉ muốn nhanh chóng lưu trữ các thay đổi của mình để khôi phục chúng sau này, bạn có thể bỏ qua ID lưu trữ.

$ git stash
...
$ git stash pop

Hãy thử nghiệm với kho lưu trữ trước khi sử dụng nó cho một số công việc thực sự quan trọng.

Tôi cũng có một phiên bản chuyên sâu hơn của điều này được đăng trên blog của tôi .


rất nhiều tài nguyên hữu ích hơn câu trả lời được cho là 'tốt nhất' ... (mặc dù câu trả lời tốt nhất đã làm cho nó rõ ràng hơn rất nhiều, có một số nhầm lẫn liên quan đến việc sử dụng đầy đủ)
kumarharsh

9

Tôi luôn cảnh giác với git stash. Nếu bạn tích trữ một vài lần, mọi thứ có xu hướng trở nên lộn xộn. danh sách git stash sẽ hiển thị danh sách được đánh số các kho lưu trữ bạn đã tạo, với các tin nhắn nếu bạn đã cung cấp chúng ... Nhưng vấn đề nằm ở thực tế là bạn không thể dọn dẹp các kho lưu trữ ngoại trừ xóa git stash tàn bạo (xóa tất cả chúng) . Vì vậy, trừ khi bạn luôn cố gắng đưa ra những thông điệp siêu mô tả cho các stash của mình (đại loại là đi ngược lại triết lý của stash), bạn sẽ phải nhận một loạt các stash khó hiểu.

Cách duy nhất tôi biết để tìm ra cái nào là sử dụng gitk --all và phát hiện các dấu vết. Ít nhất điều này cho phép bạn xem lưu trữ được tạo trên cam kết nào, cũng như sự khác biệt của mọi thứ có trong kho lưu trữ đó.

Lưu ý rằng tôi đang sử dụng git 1.5.4.3 và tôi nghĩ 1.6 thêm git stash pop, mà tôi đoán sẽ áp dụng stash đã chọn xóa nó khỏi danh sách. Có vẻ sạch hơn rất nhiều.

Hiện tại, tôi luôn cố gắng phân nhánh trừ khi tôi hoàn toàn tích cực, tôi sẽ quay lại kho hàng đó trong cùng ngày, thậm chí trong vòng một giờ.


3
Bạn có tạo ra các chi nhánh mà không đặt tên hữu ích cho chúng? Nếu không, thì tôi không hiểu tại sao bạn không làm như vậy với stash. Nếu bạn thực sự muốn biết chúng chứa gì, bạn chỉ cần sử dụng git-stash show để hiển thị tệp nào đã thay đổi hoặc áp dụng git-stash và git-diff để xem các khác biệt thực tế. Việc cắt tỉa các cành cây cũng giống như việc kiểm soát các chi nhánh của bạn.
Xiong Chiamiov 28-07-09

18
trên thực tế, bạn có thể xóa một kho lưu trữ duy nhất bằng cách sử dụnggit stash drop [<stash>]
kumarharsh

1
Đúng vậy, git đã giảm git stash từ lâu rồi. Bây giờ ít sử dụng PITA hơn nhiều. Tôi sử dụng nó hàng ngày, và thậm chí trong một khoảng thời gian dài, bây giờ.
webmat

3

Nếu bạn tìm kiếm một quy trình làm việc có thể phù hợp hơn git stash, bạn có thể muốn xem xét git-chai . Đó là một tiện ích nhằm mục đích lưu và khôi phục các trạng thái làm việc git khác nhau như git cam kết bình thường, chụp nhanh trạng thái hiện tại và thích hợp của cây làm việc của bạn và tất cả các trạng thái tệp khác nhau được hiển thị dưới trạng thái git.

Sự khác biệt chính từ git stash:

  • git stashtiết kiệm hẹp trạng thái git bẩn (tệp đã sửa đổi và tệp được thêm vào chỉ mục), trong khi git-bottleđược thiết kế để lưu mọi thứ khác với HEADvà nó phân biệt theo cách duy trì giữa các đường dẫn đã sửa đổi, sửa đổi và không thêm, không thêm, không hợp nhất, và các trạng thái rebase / merge hoàn chỉnh (chỉ các đường dẫn bên dưới .gitignorekhông được lưu).
  • git stashlưu để lưu trữ các đối tượng mà bạn cần theo dõi riêng. Nếu tôi lưu trữ thứ gì đó 2 tuần trước, tôi có thể không nhớ nó, trong khi git-bottlelưu dưới dạng cam kết dự kiến ​​cho chi nhánh hiện tại . Hành động ngược lại git-unbottletương đương với git stashpop. Có thể đẩy và chia sẻ các cam kết này giữa các kho. Điều này có thể hữu ích cho các bản dựng từ xa, nơi bạn có một kho lưu trữ khác trong một máy chủ từ xa chỉ để xây dựng hoặc để cộng tác với những người khác trong việc giải quyết xung đột.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.