Câu trả lời dễ cho câu hỏi dễ là git stash apply
Chỉ cần kiểm tra chi nhánh bạn muốn thay đổi của bạn, và sau đó git stash apply
. Sau đó sử dụng git diff
để xem kết quả.
Sau khi bạn hoàn thành xong các thay đổi của mình, apply
trông có vẻ tốt và bạn chắc chắn rằng bạn không cần sử dụng bất kỳ loại nào nữa, sau đó sử dụng git stash drop
để loại bỏ nó.
Tôi luôn đề nghị sử dụng git stash apply
chứ không phải git stash pop
. Sự khác biệt là để apply
lại stash xung quanh để dễ dàng thử lại apply
hoặc để xem, v.v. Nếu pop
có thể giải nén stash, nó sẽ ngay lập tức drop
và nếu bạn bất ngờ nhận ra rằng bạn muốn trích xuất nó ở đâu đó khác (trong một chi nhánh khác), hoặc với --index
, hoặc một số như vậy, điều đó không dễ dàng. Nếu bạn apply
, bạn có thể chọn khi nào drop
.
Mặc dù vậy, tất cả đều khá nhỏ theo cách này hay cách khác, và đối với một người mới chơi git, nó cũng sẽ giống như vậy. (Và bạn có thể bỏ qua tất cả phần còn lại của điều này!)
Điều gì xảy ra nếu bạn đang làm những thứ cao cấp hơn hoặc phức tạp hơn?
Có ít nhất ba hoặc bốn "cách sử dụng git stash" khác nhau. Trên đây là "cách 1", "cách dễ dàng":
Bạn đã bắt đầu với một nhánh sạch, đang thực hiện một số thay đổi và sau đó nhận ra rằng bạn đang thực hiện chúng ở nhánh sai. Bạn chỉ muốn thực hiện các thay đổi bạn có bây giờ và "chuyển" chúng sang chi nhánh khác.
Đây là trường hợp dễ dàng, được mô tả ở trên. Chạy git stash save
(hoặc đơn giản git stash
, điều tương tự). Kiểm tra các chi nhánh khác và sử dụng git stash apply
. Điều này được git hợp nhất trong các thay đổi trước đó của bạn, sử dụng cơ chế hợp nhất khá mạnh mẽ của git. Kiểm tra các kết quả một cách cẩn thận (với git diff
) để xem bạn có thích chúng không, và nếu có, hãy sử dụng git stash drop
để thả stash. Bạn đã hoàn tất!
Bạn đã bắt đầu một số thay đổi và cất giấu chúng. Sau đó, bạn chuyển sang một chi nhánh khác và bắt đầu thay đổi nhiều hơn, quên rằng bạn đã có những người bị bỏ rơi.
Bây giờ bạn muốn giữ, hoặc thậm chí di chuyển, những thay đổi này và cũng áp dụng stash của bạn.
Thực tế bạn có thể git stash save
một lần nữa, như git stash
tạo ra một "chồng" thay đổi. Nếu bạn làm điều đó, bạn có hai stash, một cái chỉ được gọi stash
làbbut, bạn cũng có thể viết stash@{0}
một và viết một lỗi chính tả stash@{1}
. Sử dụng git stash list
(bất cứ lúc nào) để xem tất cả. Mới nhất luôn luôn là số thấp nhất. Khi bạn git stash drop
, nó thả cái mới nhất và cái được stash@{1}
di chuyển lên đỉnh của ngăn xếp. Nếu bạn có nhiều hơn, cái đã stash@{2}
trở thành stash@{1}
, và cứ thế.
Bạn cũng có thể apply
và sau đó drop
là một stash cụ thể: git stash apply stash@{2}
và như vậy. Bỏ một stash cụ thể, chỉ đổi lại những cái được đánh số cao hơn. Một lần nữa, cái không có số cũng được stash@{0}
.
Nếu bạn chất đống rất nhiều stash, nó có thể trở nên khá lộn xộn (đó là stash tôi muốn stash@{7}
hay là vậy stash@{4}
? Đợi đã, tôi chỉ đẩy một cái khác, bây giờ là 8 và 5?). Cá nhân tôi thích chuyển những thay đổi này sang một chi nhánh mới, bởi vì các chi nhánh có tên và cleanup-attempt-in-December
có ý nghĩa với tôi nhiều hơn stash@{12}
. ( git stash
Lệnh nhận một thông báo lưu tùy chọn và những thông báo này có thể giúp ích, nhưng bằng cách nào đó, tất cả các bản sao của tôi chỉ được đặt tên WIP on branch
.)
(Nâng cao) Bạn đã sử dụng git stash save -p
, hoặc các bit cụ thể được mã hóa cẩn thận git add
và / hoặc git rm
-ed trước khi chạy git stash save
. Bạn đã có một phiên bản trong khu vực chỉ mục / dàn dựng và một phiên bản (khác) trong cây làm việc. Bạn muốn bảo tồn tất cả điều này. Vì vậy, bây giờ bạn sử dụng git stash apply --index
và đôi khi thất bại với:
Conflicts in index. Try without --index.
Bạn đang sử dụng git stash save --keep-index
để kiểm tra "những gì sẽ được cam kết". Điều này nằm ngoài phạm vi của câu trả lời này; thay vào đó, hãy xem câu trả lời StackOverflow khác .
Đối với các trường hợp phức tạp, tôi khuyên bạn nên bắt đầu trong thư mục làm việc "sạch" trước, bằng cách cam kết bất kỳ thay đổi nào bạn có ngay bây giờ (trên một nhánh mới nếu bạn muốn). Theo cách đó, "nơi nào đó" mà bạn đang áp dụng chúng, không có gì khác trong đó và bạn sẽ thử các thay đổi được lưu trữ:
git status # see if there's anything you need to commit
# uh oh, there is - let's put it on a new temp branch
git checkout -b temp # create new temp branch to save stuff
git add ... # add (and/or remove) stuff as needed
git commit # save first set of changes
Bây giờ bạn đang ở điểm bắt đầu "sạch". Hoặc có thể nó đi như thế này:
git status # see if there's anything you need to commit
# status says "nothing to commit"
git checkout -b temp # optional: create new branch for "apply"
git stash apply # apply stashed changes; see below about --index
Điều chính cần nhớ là "stash" là một cam kết, nó chỉ là một cam kết hơi "buồn cười / kỳ lạ" không phải là "trên một nhánh". Các apply
hình hoạt động vào những gì các cam kết thay đổi, và cố gắng để lặp lại nó bất cứ nơi nào bây giờ bạn đang có. Stash vẫn sẽ ở đó ( apply
giữ nó xung quanh), vì vậy bạn có thể nhìn vào nó nhiều hơn, hoặc quyết định đây là vị trí sai cho apply
nó và thử lại theo cách khác, hoặc bất cứ điều gì.
Bất cứ khi nào bạn có một stash, bạn có thể sử dụng git stash show -p
để xem phiên bản đơn giản hóa của những gì trong stash. (Phiên bản đơn giản hóa này chỉ nhìn vào các thay đổi "cây công việc cuối cùng", chứ không phải thay đổi chỉ mục đã lưu mà --index
khôi phục riêng.) Lệnh git stash apply
, không --index
, chỉ cố gắng thực hiện những thay đổi tương tự trong thư mục công việc của bạn ngay bây giờ.
Điều này đúng ngay cả khi bạn đã có một số thay đổi. Các apply
lệnh là hạnh phúc để áp dụng một stash để một sửa đổi thư mục làm việc (hoặc ít nhất, để cố gắng áp dụng nó). Bạn có thể, ví dụ, làm điều này:
git stash apply stash # apply top of stash stack
git stash apply stash@{1} # and mix in next stash stack entry too
Bạn có thể chọn thứ tự "áp dụng" tại đây, chọn ra các gói cụ thể để áp dụng theo một trình tự cụ thể. Tuy nhiên, lưu ý rằng mỗi lần về cơ bản bạn đang thực hiện "git merge" và như tài liệu hợp nhất cảnh báo:
Chạy git merge với những thay đổi không tầm thường không được khuyến khích: trong khi có thể, nó có thể khiến bạn rơi vào trạng thái khó lùi bước trong trường hợp xảy ra xung đột.
Nếu bạn bắt đầu với một thư mục sạch và chỉ đang thực hiện một số git apply
thao tác, thật dễ dàng để thoát ra: sử dụng git reset --hard
để quay lại trạng thái sạch và thay đổi apply
thao tác của bạn . (Đó là lý do tại sao tôi khuyên bạn nên bắt đầu trong một thư mục làm việc sạch trước, cho những trường hợp phức tạp này.)
Điều gì về trường hợp xấu nhất có thể xảy ra?
Giả sử bạn đang thực hiện Rất nhiều công cụ Git nâng cao và bạn đã thực hiện một cú ném và muốn git stash apply --index
, nhưng không còn có thể áp dụng lưu trữ đã lưu --index
, bởi vì chi nhánh đã chuyển hướng quá nhiều kể từ thời điểm bạn lưu nó.
Đây là những gì git stash branch
dành cho.
Nếu bạn:
- kiểm tra cam kết chính xác bạn đã thực hiện khi bạn thực hiện bản gốc
stash
, sau đó
- tạo một nhánh mới và cuối cùng
git stash apply --index
nỗ lực tạo lại các thay đổi chắc chắn sẽ hoạt động. Đây là những gì không. (Và sau đó nó bỏ stash kể từ khi nó được áp dụng thành công.)git stash branch newbranch
Một số từ cuối cùng về --index
(cái quái gì vậy?)
Những gì --index
làm là đơn giản để giải thích, nhưng một chút phức tạp trong nội bộ:
- Khi bạn có thay đổi, bạn phải
git add
(hoặc "giai đoạn") chúng trước khi commit
ing.
- Do đó, khi bạn chạy
git stash
, bạn có thể đã chỉnh sửa cả hai tệp foo
và zorg
, nhưng chỉ dàn dựng một trong số đó.
- Vì vậy, khi bạn yêu cầu lấy lại stash, sẽ rất tuyệt nếu đó
git add
là những add
thứ ed và không phải git add
là những thứ không được thêm vào. Nghĩa là, nếu bạn add
ed foo
nhưng không zorg
trở lại trước khi bạn đã làm stash
, nó có thể là tốt đẹp để có cùng một thiết lập chính xác. Những gì đã được dàn dựng, một lần nữa nên được dàn dựng; những gì đã được sửa đổi nhưng không được dàn dựng, một lần nữa nên được sửa đổi nhưng không được dàn dựng.
Các --index
lá cờ để apply
cố gắng để thiết lập những điều theo cách này. Nếu cây làm việc của bạn sạch sẽ, điều này thường chỉ hoạt động. Tuy nhiên, nếu cây công việc của bạn đã có công cụ add
ed, bạn có thể thấy làm thế nào có thể có một số vấn đề ở đây. Nếu bạn rời khỏi --index
, apply
hoạt động không cố gắng duy trì toàn bộ thiết lập theo giai đoạn / không theo giai đoạn. Thay vào đó, nó chỉ gọi máy móc hợp nhất của git, sử dụng cam kết cây công việc trong "túi đựng rác" . Nếu bạn không quan tâm đến việc giữ gìn dàn dựng / không dàn dựng, việc bỏ đi sẽ --index
giúp bạn thực hiện công việc này dễ dàng hơn rất nhiều git stash apply
.