Sự khác biệt giữa git stash pop và git stash được áp dụng


1024

Tôi đã sử dụng git stash popkhá lâu. Gần đây tôi đã tìm hiểu về git stash applylệnh. Khi tôi thử nó, nó dường như hoạt động giống như git stash pop.

Sự khác biệt giữa git stash popvà là git stash applygì?

Câu trả lời:


1628

git stash pop vứt bỏ stash (trên cùng, theo mặc định) sau khi áp dụng nó, trong khi git stash apply để nó trong danh sách stash để sử dụng lại sau này (hoặc bạn có thể sau git stash dropđó).

Điều này xảy ra trừ khi có xung đột sau đó git stash pop, trong trường hợp đó, nó sẽ không xóa stash, khiến nó hoạt động chính xác như thế nào git stash apply.

Một cách khác để xem xét nó: git stash popgit stash apply && git stash drop.


117
như ghi chú câu trả lời của @ briankip bên dưới, nếu có xung đột khi bật stash, pop sẽ không xóa stash (và sẽ hành xử chính xác như áp dụng)
Kashif

Có vẻ như ngay cả khi những thay đổi không có căn cứ trong chi nhánh của bạn giống với git stash popkết quả của nó, bạn vẫn sẽ gặp lỗi xung đột.
DimP

79

Có liên kết hữu ích này nói lên sự khác biệt, như John Zwinck đã nêu và một nhược điểm git stash pop.

Chẳng hạn, giả sử stash của bạn thay đổi xung đột với các thay đổi khác mà bạn đã thực hiện kể từ lần đầu tiên bạn tạo stash. Cả pop và áp dụng sẽ kích hoạt một cách hữu ích chế độ giải quyết xung đột hợp nhất, cho phép bạn giải quyết một cách độc đáo những xung đột như vậy và cũng sẽ không thoát khỏi stash, mặc dù có lẽ bạn cũng đang mong đợi pop. Vì rất nhiều người mong đợi stash chỉ là một stack đơn giản, điều này thường dẫn đến việc họ vô tình xuất hiện cùng một stash sau đó vì họ nghĩ rằng nó đã biến mất.

Liên kết: http://codingkillsthecat.wordpress.com/2012/04/27/git-stash-pop-considered-harmful/


6
Thực tế của một stash kéo dài khi một pop thất bại thực sự không phải là một nhược điểm, mặc dù lúc đầu nó có vẻ như vậy.
Amalgovinus

65

git stash popáp dụng phần tử được sắp xếp trên cùng và loại bỏ nó khỏi ngăn xếp. git stash applylàm như vậy, nhưng để nó trong ngăn xếp.


43

Nhìn thấy nó trong hành động có thể giúp bạn hiểu rõ hơn về sự khác biệt.

Giả sử chúng tôi đang làm việc trên masternhánh và có một tệp hello.txtchứa chuỗi "Xin chào".

Hãy sửa đổi tệp và thêm chuỗi "thế giới" vào nó. Bây giờ bạn muốn chuyển đến một chi nhánh khác để sửa một lỗi nhỏ bạn vừa tìm thấy, vì vậy bạn cần stashthay đổi:

git stash

Bạn đã chuyển sang chi nhánh khác, sửa lỗi và bây giờ bạn đã sẵn sàng tiếp tục làm việc trên masterchi nhánh của mình , do đó, bạn sẽ popthay đổi:

git stash pop

Bây giờ nếu bạn cố gắng xem lại nội dung stash bạn sẽ nhận được:

$ git stash show -p
No stash found.

Tuy nhiên, nếu bạn sử dụng git stash applythay thế, bạn sẽ nhận được nội dung được lưu trữ nhưng bạn cũng sẽ giữ nó:

$ git stash show -p
diff --git a/hello.txt b/hello.txt
index e965047..802992c 100644
--- a/hello.txt
+++ b/hello.txt
@@ -1 +1 @@
-Hello
+Hello world

Vì vậy, popgiống như pop của stack - nó thực sự loại bỏ phần tử một khi nó xuất hiện, trong khi applygiống như nhìn trộm hơn .


5

Trong git stash là vùng lưu trữ nơi các tệp thay đổi hiện tại có thể được di chuyển.

stashkhu vực này hữu ích khi bạn muốn lấy một số thay đổi từ gitkho lưu trữ và phát hiện một số thay đổi trong một số tệp tương hỗ có sẵn trong gitrepo.

git stash apply //apply the changes without removing stored files from stash area.

git stash pop  // apply the changes as well as remove stored files from stash area.

Lưu ý: - git applychỉ áp dụng các thay đổi từ vùng ẩn trong khi git popáp dụng cũng như xóa thay đổi khỏi stashvùng.


1

Git Stash Pop vs applylàm việc

Nếu bạn muốn áp dụng các thay đổi được sắp xếp hàng đầu của mình cho thay đổi không theo giai đoạn hiện tại và xóa cả stash đó, thì bạn nên thực hiện git stash pop.

# apply the top stashed changes and delete it from git stash area.
git stash pop  

Nhưng nếu bạn muốn áp dụng các thay đổi được sắp xếp hàng đầu của mình cho thay đổi không theo giai đoạn hiện tại mà không xóa nó, thì bạn nên thực hiện git stash apply.

Lưu ý: Bạn có thể liên kết trường hợp này với Stacklớp pop()peek()phương thức, trong đó pop thay đổi đỉnh bằng cách giảm (top = top-1) nhưng peek()chỉ có thể lấy phần tử trên cùng.

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.