Question

J'ai un petit patch sauvé dans ma réserve. Je l'ai appliqué à ma copie de travail à l'aide de git stash apply . Maintenant, j'aimerais revenir sur ces modifications en inversant l'application du correctif (un peu comme ce que git revert ferait, mais contre le stash).

Quelqu'un sait-il comment faire cela?

Clarification: ma copie de travail a été modifiée. Mon cas particulier est difficile à décrire, mais vous pouvez imaginer un code de débogage ou expérimental caché. À présent, ma copie de travail est mélangée à d'autres modifications et j'aimerais voir l'effet avec et sans les modifications de la réserve.

Il ne semble pas que stash prenne en charge cela actuellement, mais un stash git appliquer --reverse serait une fonctionnalité intéressante.

Était-ce utile?

La solution

Selon la page de manuel de git-stash , " une cachette est représentée par un commit dont l’arborescence enregistre l’état du répertoire de travail et dont le premier parent est commit à HEAD lors de la création de la dissimulation, " et git stash show -p nous indique "les modifications enregistrées dans la dissimulation sous forme de différence entre l'état masqué et son parent d'origine.

Pour conserver vos autres modifications intactes, utilisez git stash show -p | patch --reverse comme suit:

$ git init
Initialized empty Git repository in /tmp/repo/.git/

$ echo Hello, world >messages

$ git add messages

$ git commit -am 'Initial commit'
[master (root-commit)]: created 1ff2478: "Initial commit"
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 messages

$ echo Hello again >>messages

$ git stash

$ git status
# On branch master
nothing to commit (working directory clean)

$ git stash apply
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   messages
#
no changes added to commit (use "git add" and/or "git commit -a")

$ echo Howdy all >>messages

$ git diff
diff --git a/messages b/messages
index a5c1966..eade523 100644
--- a/messages
+++ b/messages
@@ -1 +1,3 @@
 Hello, world
+Hello again
+Howdy all

$ git stash show -p | patch --reverse
patching file messages
Hunk #1 succeeded at 1 with fuzz 1.

$ git diff
diff --git a/messages b/messages
index a5c1966..364fc91 100644
--- a/messages
+++ b/messages
@@ -1 +1,2 @@
 Hello, world
+Howdy all

Modifier:

Une légère amélioration à cela consiste à utiliser git apply à la place du patch:

git stash show -p | git apply --reverse

Vous pouvez également utiliser git apply -R en abrégé de git apply --reverse .

Je trouve cela très utile ces derniers temps ...

Autres conseils

cachette git [enregistrer] prend l'état de votre répertoire de travail et de votre index et les cache, en définissant l'index et la zone de travail sur la version HEAD .

git stash apply ramène ces modifications afin que git reset --hard les supprime à nouveau.

git stash pop ramène ces modifications et supprime les modifications stockées en haut, de sorte que git stash [save] revienne à l'état précédent (pré-pop) dans ce cas.

git checkout -f

supprimera toutes les modifications non validées.

Coupure directe dans la page de manuel de git C'est clairement formulé et inclut même un alias;

Annulation de l'application d'un Stash Dans certains scénarios de cas d'utilisation, vous pouvez appliquer des modifications masquées, effectuer certains travaux, puis désappliquer les modifications issues du masquage. Git ne fournit pas une telle commande stash unapply, mais il est possible d’obtenir cet effet en récupérant simplement le patch associé à une stash et en l’appliquant à l’inverse:

$ git stash show -p stash@{0} | git apply -R

Encore une fois, si vous ne spécifiez pas de cachette, Git supposera la cachette la plus récente:

$ git stash show -p | git apply -R

Vous voudrez peut-être créer un alias et ajouter efficacement une commande stash-unapply à votre Git. Par exemple:

$ git config --global alias.stash-unapply '!git stash show -p | git apply -R'
$ git stash apply
$ #... work work work
$ git stash-unapply

Cela fait longtemps que nous devons le faire, mais si j’interprète correctement le problème, j’ai trouvé une solution simple, remarquez, c’est une explication dans ma propre terminologie:

git stash [enregistrer] permettra d'éviter les modifications actuelles et de définir votre branche actuelle sur "état de nettoyage"

.

La liste de masquage git donne quelque chose comme: stash @ {0}: lors du développement: sauvegardé dans le matériel de test

git appliquer stash @ {0} définit la branche actuelle sur avant stash [save]

git checkout. Définit la branche actuelle comme après stash [save]

Le code qui est enregistré dans la cachette n'est pas perdu, il peut être retrouvé par git apply stash @ {0} à nouveau.

Anywhay, cela a fonctionné pour moi!

En plus de la réponse @Greg Bacon, dans le cas où des fichiers binaires ont été ajoutés à l'index et font partie de la réserve à l'aide de

git stash show -p | git apply --reverse

peut entraîner

error: cannot apply binary patch to '<YOUR_NEW_FILE>' without full index line
error: <YOUR_NEW_FILE>: patch does not apply

L'ajout de - binary résout le problème, mais n'a malheureusement pas encore compris pourquoi.

 git stash show -p --binary | git apply --reverse

Ceci s’ajoute aux réponses ci-dessus, mais ajoute une recherche du contenu git basé sur le message, car le numéro de contenu peut changer lorsque de nouveaux fichiers masqués sont enregistrés. J'ai écrit quelques fonctions bash:

apply(){
  if [ "$1" ]; then
    git stash apply `git stash list | grep -oPm1 "(.*)(?=:.*:.*$1.*)"`
  fi
}
remove(){
  if [ "$1" ]; then
    git stash show -p `git stash list | grep -oPm1 "(.*)(?=:.*:.*$1.*)"` | git apply -R
    git status
  fi
}
  1. Créer une réserve avec le nom (message) $ git stash enregistrer "ma réserve" "
  2. Pour appliquer le nom $ apply " my stash &
  3. Pour supprimer la réserve nommée $ remove & my; stash "
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top