Comment inverser appliquer une cachette?
J'ai un petit patch enregistré au loin, dans mon git stash. J'ai appliqué à ma copie de travail à l'aide de git stash apply
. Maintenant, je tiens à revenir sur ces modifications à l'application du patch (un peu comme ce que git revert
le ferait, mais contre la cachette).
Personne ne sait comment faire cela?
Précisions: Il y a d'autres changements dans ma copie de travail. Mon cas particulier, est difficile à décrire, mais vous pouvez imaginer un peu de débogage ou de l'expérimental code qui est dans le coffre. Maintenant, il est mélangé dans ma copie de travail avec quelques autres changements et j'aimerais voir l'effet avec et sans que les modifications de la cachette.
Il ne ressemble pas à la planque de soutient à l'heure actuelle, mais un git stash apply --reverse
serait une fonctionnalité intéressante.
- Ne pouvez pas il suffit de créer une inversion de patch par comparaison entre l'actuelle et la version précédente? Et puis appliquez un?
- Existe-il des changements dans l'arbre de travail autres que l'appliquées cachette?
Vous devez vous connecter pour publier un commentaire.
Selon la git-stash page de manuel, "Une cachette est représenté comme un commit dont l'arborescence des dossiers de l'état du répertoire de travail, et son premier parent est le commit à
HEAD
lorsque la réserve a été créée," etgit stash show -p
nous donne "les modifications enregistrées dans la cachette comme un diff entre le planqué de l'état et de ses parents d'origine.De garder vos autres changements intacte, utilisez
git stash show -p | patch --reverse
comme dans l'exemple suivant:Edit:
Une légère amélioration pour cela est d'utiliser
git apply
en place du patch:Alternativement, vous pouvez également utiliser
git apply -R
comme une abréviation pourgit apply --reverse
.J'ai trouvé cela vraiment pratique ces derniers temps...
git apply -R
est une amélioration, au moins pour moi sur ma boîte de windows avec git bashpatch --reverse
eu des problèmes pour localiser le fichier de patch (pas de réelle idée de pourquoi l'alternative travaillé). +1 et bonne explication--index
, tout comme cegit stash show -p | git apply --reverse --index
. Parce que vous n'avez plus besoin d'ajouter dans l'index de l'changements qui sont repris.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 quel peut être le problème?…| git apply --reverse
fonctionne pour moi. Le…| patch --reverse
échoue aveccan't find file to patch at input line 5
. Archlinux système ici, patch version 2.7.6.git stash
[save]
prend votre répertoire de travail de l'état, et de votre état de l'index, et les caches, les index de réglage et de la zone de travail pourHEAD
version.git stash apply
apporte ces modifications, de sortegit reset --hard
serait de les supprimer.git stash pop
apporte ces modifications et supprime haut planqué changement, de sortegit stash [save]
serait de retour à la précédente (pré-pop) de l'état dans ce cas.va supprimer toute non-valider les modifications.
Direct cut n paste de la git page de man
C'est clairement formulée et inclut même un alias;
De l'onu-l'application d'une Cachette
Dans certains scénarios de cas d'utilisation, vous pouvez appliquer planqué changements, faire un peu de travail, mais de l'onu,-appliquer les changements que ceux-originaire de la cachette. Git ne fournissent pas une cachette annuler la commande, mais il est possible d'obtenir l'effet simplement de récupérer le patch associé à une cachette et de l'appliquer dans le sens inverse:
Encore une fois, si vous ne spécifiez pas une cachette, Git suppose le plus récent stash:
Vous pouvez créer un alias et effectivement ajouter une cachette-annuler la commande de votre Git. Par exemple:
C'est fini depuis longtemps, mais si j'interprète correctement la problématique, j'ai trouvé une solution simple, remarque, c'est une explication dans mon propre terminologie:
git stash [save]
permettra d'économiser de loin changements en cours et de l'ensemble de votre branche courante à la "état propre"git stash list
donne quelque chose comme:stash@{0}: On develop: saved testing-stuff
git apply stash@{0}
mettra actuelle de la branche de avantstash [save]
git checkout .
Mettra actuelle de la branche de aprèsstash [save]
Le code qui est enregistré dans le coffre n'est pas perdu, il peut être trouvé par
git apply stash@{0}
de nouveau.Anywhay, cela a fonctionné pour moi!
git stash apply --reverse
d'abord et ensuite simplement allé retour àgit stash apply stash@{x}
que vous mentionnez. Travaillé avec pas de problèmes.En plus de @Greg Bacon réponse, dans le cas des fichiers binaires ont été ajoutés à l'index et faisaient partie de la réserve à l'aide de
peut entraîner
Ajoutant
--binary
résout le problème, mais, malheureusement, n'ont pas compris pourquoi encore.C'est en plus des réponses ci-dessus, mais ajoute de recherche pour le git stash basé sur le message que le coffre peut changer lorsque de nouvelles caches sont enregistrés.
J'ai écrit un couple de bash fonctions:
$ git stash save "my stash"
$ apply "my stash"
$ remove "my stash"