J'ai un petit patch conservé dans ma cachette git. Je l'ai appliqué à ma copie de travail en utilisant git stash apply
. Maintenant, je voudrais annuler ces modifications en appliquant le patch à l'envers (un peu comme ce git revert
qui ferait mais contre la cachette).
Est-ce que quelqu'un sait comment faire ça?
Clarification: il y a d'autres changements dans ma copie de travail. Mon cas particulier est difficile à décrire, mais vous pouvez imaginer un code de débogage ou expérimental qui est dans la cachette. Maintenant, il est mélangé dans ma copie de travail avec d'autres modifications et j'aimerais voir l'effet avec et sans les modifications de la cachette.
Il ne semble pas que stash le supporte actuellement, mais ce git stash apply --reverse
serait une fonctionnalité intéressante.
Réponses:
Selon la page de manuel git-stash , "Une stash est représentée comme un commit dont l'arborescence enregistre l'état du répertoire de travail, et son premier parent est le commit au
HEAD
moment où la stash a été créée", etgit stash show -p
nous donne "les changements enregistrés dans le stash en tant que différence entre l'état stashed et son parent d'origine.Pour conserver vos autres modifications intactes, utilisez
git stash show -p | patch --reverse
comme suit:Éditer:
Une légère amélioration est à utiliser
git apply
à la place du patch:Alternativement, vous pouvez également utiliser
git apply -R
comme raccourci pourgit apply --reverse
.J'ai trouvé ça très pratique ces derniers temps ...
la source
git apply -R
c'est une amélioration, au moins pour moi sur ma boîte Windows avec git bash car j'aipatch --reverse
eu des problèmes pour localiser le fichier à patcher (pas vraiment la raison pour laquelle l'alternative a fonctionné). +1 et bonne explication--index
juste comme çagit stash show -p | git apply --reverse --index
. Parce que vous n'avez plus besoin d'ajouter dans l'index les modifications qui sont annulées.git stash show -p | git apply -R -v
avec le message:Checking patch messages... error: while searching for: Hello, world Hello again error: patch failed: messages:1
. Savez-vous ce qui pourrait mal se passer?git stash
[save]
prend votre état de répertoire de travail et votre état d'index et les cache, définissant l'index et la zone de travail sur laHEAD
version.git stash apply
ramène ces modifications, doncgit reset --hard
les supprimerait à nouveau.git stash pop
ramène ces changements et supprime les changements cachés, doncgit stash [save]
retournerait à l'état précédent (pré-pop) dans ce cas.la source
supprimera toutes les modifications non validées.
la source
La page de manuel V1 git contenait une référence sur la non-application d'un stash. L'extrait est ci-dessous.
La page de manuel git V2 plus récente n'inclut aucune référence à la non-application d'un stash mais le ci-dessous fonctionne toujours bien
Non-application d'un Stash Dans certains scénarios de cas d'utilisation, vous souhaiterez peut-être appliquer des modifications stashées, effectuer un certain travail, puis annuler les modifications qui provenaient à l'origine du stash. Git ne fournit pas une telle commande de non-application de stash, mais il est possible d'obtenir l'effet en récupérant simplement le patch associé à une stash et en l'appliquant à l'envers:
Encore une fois, si vous ne spécifiez pas de cachette, Git suppose la cachette la plus récente:
Vous voudrez peut-être créer un alias et ajouter efficacement une commande de stash-unapply à votre Git. Par exemple:
la source
Cela fait trop longtemps, mais si j'interprète correctement le problème, j'ai trouvé une solution simple, notez, ceci est une explication dans ma propre terminologie:
git stash [save]
enregistrera les modifications actuelles et mettra votre branche actuelle en "état propre"git stash list
donne quelque chose comme:stash@{0}: On develop: saved testing-stuff
git apply stash@{0}
définira la branche actuelle comme auparavantstash [save]
git checkout .
Définira la branche actuelle comme aprèsstash [save]
Le code qui est enregistré dans la cachette n'est pas perdu, il peut être retrouvé par
git apply stash@{0}
.Quoi qu'il en soit, cela a fonctionné pour moi!
la source
git stash apply --reverse
première, puis je suis simplement revenu sur cegit stash apply stash@{x}
que vous mentionnez. Fonctionné sans problème.En dehors de ce que d'autres ont mentionné, le moyen le plus simple consiste à
puis vérifier tous les changements locaux
la source
En plus de la réponse @Greg Bacon, dans le cas où des fichiers binaires étaient ajoutés à l'index et faisaient partie de la cachette en utilisant
peut entraîner
L'ajout
--binary
résout le problème, mais n'a malheureusement pas encore compris pourquoi.la source
Vous pouvez suivre l'image que j'ai partagée pour la décompresser si vous avez accidentellement appuyé sur la dissimulation.
la source
Ceci s'ajoute aux réponses ci-dessus, mais ajoute la recherche de la cachette git en fonction du message, car le numéro de cachette peut changer lorsque de nouvelles cachettes sont enregistrées. J'ai écrit quelques fonctions bash:
$ git stash save "my stash"
$ apply "my stash"
$ remove "my stash"
la source