Існує різниця між git stash pop та git stash


1023

Я використовую git stash popвже досить давно. Нещодавно я дізнався про git stash applyкоманду. Коли я спробував це, здавалося, працює так само, як git stash pop.

У чому різниця між git stash popі git stash apply?

Відповіді:


1626

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 нижче, якщо виникають конфлікти при появі скриньки, поп не видалить приховування (і буде вести себе точно так само, як застосувати)
Kashif

Здається, що навіть якщо нестандартні зміни у вашій філії збігаються git stash popз результатами, ви все одно отримаєте конфліктну помилку.
DimP

79

Отримав це корисне посилання, яке констатує різницю, як заявив Джон Цвінк і недолік git stash pop.

Наприклад, скажіть, що ваші приховані зміни суперечать іншим змінам, які ви внесли з моменту першого створення сховища. І поп, і застосовні програми допоможуть запустити режим вирішення конфліктів, дозволяючи добре вирішити такі конфлікти ... і жоден з них не позбудеться прихованих ситуацій, навіть якщо, можливо, ви також очікуєте, що поп також. Оскільки багато людей очікують, що прихильність буде просто простим стеком, це часто призводить до того, що вони випадково пізніше вискакують ту саму скриньку, бо думали, що її вже немає.

Посилання: http://codingkilledthecat.wordpress.com/2012/04/27/git-stash-pop-considered-harmful/


6
Факт затримки, коли поп не вдався, насправді не є недоліком, хоча спочатку це може здатися таким.
Амальговінус

65

git stash popзастосовує верхній схований елемент і видаляє його зі стека. git stash applyробить те ж саме, але залишає це в стеці.


42

Бачити це в дії може допомогти вам краще зрозуміти різницю.

Припустимо, що ми працюємо у 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з'являється , в той час як більше схожий на заглянути .


5

У git схованці є область зберігання , де поточні змінені файли можуть бути переміщені.

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()методами, коли поп змінює верх по декрементам (top = top-1), але peek()лише отримує верхній елемент.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.