Разница между git stash pop и git stash


1024

Я использую в git stash popтечение достаточно долгого времени. Я недавно узнал о git stash applyкоманде. Когда я попробовал это, это, казалось, работало так же, как git stash pop.

В чем разница между git stash popи git stash apply?

Ответы:


1629

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

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

Еще один способ взглянуть на это: git stash popесть git stash apply && git stash drop.


117
как примечания к ответу @ briankip ниже, если при выталкивании тайника возникают конфликты, pop не удалит тайник (и будет вести себя точно так же, как и при применении)
Kashif

Похоже, что даже если неустановленные изменения в вашей ветке совпадают git stash popс результатами, вы все равно получите ошибку конфликта.
ДимП

79

Получил эту полезную ссылку, в которой говорится о разнице, как заявил Джон Цвинк, и о недостатке git stash pop.

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

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


6
Тот факт, что тайник задержался, когда поп-музыка провалилась, не является недостатком, хотя на первый взгляд может показаться, что это так.
Амальговинус

65

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


43

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

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

Давайте изменим файл и добавим к нему строку "world". Теперь вы хотите перейти в другую ветку, чтобы исправить небольшую ошибку, которую вы только что нашли, поэтому вам нужно внести 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 .


5

В git stash находится область хранения, куда могут быть перемещены текущие измененные файлы.

stashОбласть полезна, когда вы хотите извлечь некоторые изменения из gitрепозитория и обнаружить некоторые изменения в некоторых общих файлах, доступных в gitрепо.

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.

Примечание: - git applyприменять изменения только из области git popхранения, а также удалять изменения из stashобласти.


1

Git Stash Pop vs applyWorking

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

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

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

Примечание: Вы можете связать этот случай с Stackклассом pop()и peek()методами, где pop изменяет верхнюю часть на уменьшение (top = top-1), но peek()может получить только верхний элемент.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.