Obowiązują różnice między git stash pop a git stash

1022

Używam od git stash popdłuższego czasu. Niedawno dowiedziałem się o git stash applypoleceniu. Kiedy go wypróbowałem, wydawało się, że działa tak samo jak git stash pop.

Jaka jest różnica między git stash popi git stash apply?

Sandeep Raju Prabhakar
źródło

Odpowiedzi:

1626

git stash pop wyrzuca (najwyżej domyślnie) skrytkę po jej zastosowaniu, git stash apply pozostawiając ją na liście skrytek w celu ewentualnego późniejszego ponownego wykorzystania (lub możesz wtedy git stash drop).

Dzieje się tak, chyba że później git stash popwystąpią konflikty , w którym to przypadku nie usunie skrytki, pozostawiając ją dokładnie taką samą git stash apply.

Innym sposobem, aby na to spojrzeć: git stash popjest git stash apply && git stash drop.

John Zwinck
źródło
117
jak podano w odpowiedzi @ briankip poniżej, jeśli wystąpią konflikty, gdy skrytka jest otwierana, pop nie usunie skrytki (i będzie się zachowywać dokładnie tak, jak stosuje się)
Kashif
Wygląda na to, że nawet jeśli niestabilne zmiany w gałęzi są takie same, jak git stash popwynik, nadal występuje błąd konfliktu.
DimP
79

Mam ten pomocny link, który określa różnicę, jak stwierdził John Zwinck, i wadą git stash pop.

Powiedzmy na przykład, że twoje zmiany ukryte są w konflikcie z innymi zmianami, które wprowadziłeś od czasu pierwszego utworzenia skrytki. Zarówno pop, jak i zastosuj, aktywują tryb rozwiązywania konfliktów scalania, umożliwiając ładne rozwiązanie takich konfliktów… i żadne z nich nie pozbędzie się skrytki, chociaż być może oczekujesz też popu. Ponieważ wiele osób spodziewa się, że skrytki są zwykłym stosem, często prowadzi to do przypadkowego późniejszego wyrzucenia tego samego skrytki, ponieważ myśleli, że go nie ma.

Link: http://codingkilledthecat.wordpress.com/2012/04/27/git-stash-pop-consanted-harmful/

briankip
źródło
6
Fakt, że ukrycie trwało, gdy pop nie powiódł się, naprawdę nie jest wadą, nawet jeśli na początku może się tak wydawać.
Amalgovinus,
65

git stash popstosuje górny ukryty element i usuwa go ze stosu. git stash applyrobi to samo, ale pozostawia go w stosie skrytek.

jchapa
źródło
42

Widząc to w akcji, możesz lepiej zrozumieć różnicę.

Zakładając, że pracujemy nad mastergałęzią i mamy plik hello.txtzawierający ciąg „Hello”.

Zmodyfikujmy plik i dodajmy do niego ciąg „world”. Teraz chcesz przejść do innej gałęzi, aby naprawić właśnie znaleziony drobny błąd, więc musisz stashwprowadzić zmiany:

git stash

Przeprowadziłeś się do drugiej gałęzi, naprawiłeś błąd i teraz możesz kontynuować pracę nad mastergałęzią, więc popzmiany:

git stash pop

Teraz, jeśli spróbujesz przejrzeć zawartość skrytki, otrzymasz:

$ git stash show -p
No stash found.

Jeśli jednak użyjesz git stash applyzamiast tego, otrzymasz ukrytą zawartość, ale również ją zatrzymasz:

$ 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

Podobnie popjest z popem stosu - w rzeczywistości usuwa element po jego pęknięciu, a applybardziej przypomina podglądanie .

Maroun
źródło
5

W git zapasach to powierzchnia magazynowa, gdzie obecne pliki zmienione mogą zostać przeniesione.

stashObszar jest przydatny, gdy chcesz pobrać niektóre zmiany z gitrepozytorium i wykryć pewne zmiany w niektórych plikach wzajemnych dostępnych w gitrepozytorium.

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.

Uwaga: - git applystosuj zmiany tylko z obszaru skrytki podczas git popstosowania, a także usuwaj zmiany z stashobszaru.

Vikrant Kashyap
źródło
1

Git Stash Pop vs applyWorking

Jeśli chcesz zastosować najlepsze ukryte zmiany do bieżącej zmiany niestacjonarnej i usunąć również tę skrytkę, powinieneś wybrać git stash pop.

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

Ale jeśli chcesz zastosować swoje najważniejsze zmiany do bieżącej zmiany niestopowej bez usuwania jej, powinieneś wybrać git stash apply.

Uwaga: Możesz powiązać ten przypadek z Stackklasą pop()i peek()metodami, w których pop zmienia górę za pomocą dekrementów (top = top-1), ale peek()może tylko uzyskać element najwyższy.

Vikrant Kashyap
źródło