2013-03-08 6 views

ответ

821

git stash pop выбрасывает (верхний, по умолчанию) притона после его применения, в то время как git stash apply оставляет его в списке притона для возможного последующего повторного использования (или вы можете затем git stash drop его). Это происходит, если не возникнут конфликты после git stash pop, в этом случае он не удалит стаск, ведя себя точно так же, как git stash apply.

Другой способ взглянуть на это: git stash pop is git stash apply && git stash drop.

+67

как ответ на комментарий к briankip ниже, если есть конфликты при появлении кошелька, pop не удалит stash (и будет вести себя точно так же, как применять) – Kashif

+1

@John Zwinck последняя строка более понятна, спасибо – Suresh

+0

спасибо за этот комментарий @Kashif –

37

git stash pop применяет верхний скрытый элемент и удаляет его из стека. git stash apply делает то же самое, но оставляет его в стеке.

58

Получил эту полезную ссылку, в которой говорится о различии, как заявил Джон Звинк и недостаток поп-музыки Git.

Например, ваши спрятанные изменения конфликтуют с другими изменениями, которые вы сделали с момента создания сейфа. Как pop, так и apply будут эффективно запускать режим разрешения конфликтов слиянием, позволяя вам красиво разрешать такие конфликты ... и ни один из них не избавится от кошелька, хотя, возможно, вы ожидаете поп-музыки. Поскольку многие люди ожидают, что stashes просто будет простым стеком, это часто приводит к тому, что они случайно выталкивают один и тот же штамп позже, потому что они думали, что он ушел.

Ссылка http://codingkilledthecat.wordpress.com/2012/04/27/git-stash-pop-considered-harmful/

+4

Это было действительно полезно. Я столкнулся с поп-музыкой с конфликтами и позже подумал, почему в списке записок все еще есть список. – Kashif

+0

Это было действительно полезно, когда я случайно попал в папку с неправильной веткой. – Rahi

+1

Тот факт, что застревание, когда поп провалился, действительно не является недостатком, даже если это может показаться на первый взгляд. – Amalgovinus

12

Видя его в действии может помочь вам лучше понять разницу.

Предполагая, что мы работаем над веткой master и имеем файл hello.txt, содержащий строку «Hello».

Давайте изменим файл и добавим ему «мир». Теперь вы хотите, чтобы перейти на другую ветку, чтобы исправить небольшую ошибку, вы только нашли, так что вам нужно stash изменения:

git stash 

Вы переехали в другой ветви, исправлена ​​ошибка, и теперь вы готов продолжить работу над вашей master ветви, так что вы pop изменения:

git stash pop 

Теперь, если вы пытаетесь просмотреть содержание копить вы получите:

$ git stash show -p 
No stash found. 

Однако, если вы используете git stash apply вместо этого, вы получите прятали содержание, но вы также будете держать его:

$ 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 

Так pop это так же, как попы стеки - это на самом деле удаляет элемент после его совали, в то время как apply больше похожа на peek.

Смежные вопросы