Différence entre git stash pop et git stash apply

1024

J'utilise git stash popdepuis un certain temps. J'ai récemment découvert la git stash applycommande. Quand je l'ai essayé, cela semblait fonctionner de la même manière que git stash pop.

Quelle est la difference entre git stash popet git stash apply?

Sandeep Raju Prabhakar
la source

Réponses:

1629

git stash pop jette la cachette (la plus haute, par défaut) après l'avoir appliquée, tandis git stash apply qu'elle la laisse dans la liste de cachettes pour une éventuelle réutilisation ultérieure (ou vous pouvez ensuite la git stash dropfaire).

Cela se produit à moins qu'il n'y ait des conflits après git stash pop, auquel cas il ne supprimera pas la cachette, la laissant se comporter exactement comme git stash apply.

Une autre façon de voir les choses: git stash popc'est git stash apply && git stash drop.

John Zwinck
la source
117
comme dans les notes de réponse de @ briankip ci-dessous, s'il y a des conflits quand une cachette est sautée, la pop n'enlèvera pas la cachette (et se comportera exactement comme s'applique)
Kashif
Il semble que même si les modifications non mises en scène dans votre branche sont les mêmes que git stash pople résultat, vous obtiendrez toujours une erreur de conflit.
DimP
79

Vous avez ce lien utile qui indique la différence, comme l'a déclaré John Zwinck et un inconvénient de git stash pop.

Par exemple, supposons que vos modifications cachées entrent en conflit avec d'autres modifications que vous avez apportées depuis la création de la cachette. Pop et Apply déclencheront utilement le mode de résolution des conflits de fusion, vous permettant de résoudre facilement de tels conflits ... et aucun ne se débarrassera de la cachette, même si vous attendez peut-être aussi la pop. Étant donné que beaucoup de gens s'attendent à ce que les cachettes ne soient qu'une simple pile, cela les amène souvent à faire sauter la même cachette accidentellement plus tard, car ils pensaient qu'elle était partie.

Lien: http://codingkilledthecat.wordpress.com/2012/04/27/git-stash-pop-considered-harmful/

briankip
la source
6
Le fait qu'une cachette persiste quand une pop a échoué n'est vraiment pas un inconvénient, même si cela peut sembler au premier abord.
Amalgovinus
65

git stash popapplique l'élément caché supérieur et le supprime de la pile. git stash applyfait de même, mais le laisse dans la pile de stockage.

jchapa
la source
43

Le voir en action pourrait vous aider à mieux comprendre la différence.

En supposant que nous travaillons sur une masterbranche et que nous avons un fichier hello.txtqui contient une chaîne "Hello".

Modifions le fichier et y ajoutons la chaîne "world". Maintenant, vous voulez passer à une autre branche pour corriger un bug mineur que vous venez de trouver, vous devez donc stashapporter vos modifications:

git stash

Vous avez déménagé dans l'autre branche, corrigé le bug et maintenant vous êtes prêt à continuer à travailler sur votre masterbranche, donc vous poples changements:

git stash pop

Maintenant, si vous essayez d'examiner le contenu de la cachette, vous obtiendrez:

$ git stash show -p
No stash found.

Cependant, si vous utilisez à la git stash applyplace, vous obtiendrez le contenu caché mais vous le conserverez également:

$ 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

Il en popva de même pour le pop de la pile - il supprime réellement l'élément une fois qu'il est sauté, alors qu'il applyressemble plus à un coup d'œil .

Maroun
la source
5

In git stash est une zone de stockage où les fichiers modifiés en cours peuvent être déplacés.

stashest utile lorsque vous souhaitez extraire certaines modifications du gitréférentiel et détecter des modifications dans certains fichiers mutuels disponibles dans le référentiel 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.

Remarque: - git applyn'appliquez les modifications de la zone de stockage que pendant l' git popapplication et supprimez les modifications de la stashzone.

Vikrant Kashyap
la source
1

Git Stash Pop vs applytravail

Si vous souhaitez appliquer vos principales modifications stockées à la modification non intermédiaire actuelle et supprimer également cette dernière, vous devriez opter pour git stash pop.

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

Mais si vous souhaitez appliquer vos principales modifications stockées à la modification non intermédiaire actuelle sans la supprimer, vous devriez opter pour git stash apply.

Remarque: Vous pouvez associer ce cas à une Stackclasse pop()et à des peek()méthodes, où pop change le haut par des décréments (haut = haut-1) mais peek()ne peut obtenir que l'élément supérieur.

Vikrant Kashyap
la source