323 votes

Comment appliquer à l'envers une cachette ?

J'ai un petit patch sauvegardé dans ma cachette git. Je l'ai appliqué à ma copie de travail en utilisant la fonction git stash apply . Maintenant, j'aimerais annuler ces changements en appliquant le correctif de manière inverse (un peu comme ce que fait le git revert ferait mais contre la réserve).

Quelqu'un sait-il comment faire ?

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 se trouve dans la cachette. Il est maintenant mélangé dans ma copie de travail avec d'autres changements et je voudrais voir l'effet avec et sans les changements de la cachette.

Il ne semble pas que Stash supporte cela actuellement, mais une git stash apply --reverse serait une fonctionnalité intéressante.

1 votes

Ne peut-on pas simplement créer un patch inversé en faisant la différence entre la révision actuelle et la précédente ? Et ensuite appliquer celui-là ?

0 votes

Y a-t-il des changements dans l'arbre de travail autres que la réserve appliquée ?

0 votes

Ajouter ceci ici, ... était censé être une FAQ pas une question... stackoverflow.com/questions/59973103/

0voto

lifesoordinary Points 73

Cela s'ajoute aux réponses ci-dessus, mais ajoute la recherche de la cachette git basée sur le message, car le numéro de la cachette peut changer lorsque de nouvelles cachettes sont enregistrées. J'ai écrit un couple de 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 cachette avec un nom (message) $ git stash save "my stash"
  2. Pour appliquer le nom $ apply "my stash"
  3. Pour retirer la cachette nommée $ remove "my stash"

0voto

Tom Dickman Points 109

J'ai eu un problème similaire, je pense que tout ce que vous devez faire est de git reset --hard et vous ne perdrez pas vos modifications ou les modifications non suivies.

Si vous lisez les documents dans git stash --help il est indiqué que l'application est "comme le pop, mais ne supprime pas l'état de la liste de la cachette", donc l'état réside toujours là, vous pouvez le récupérer.

Alternativement, si vous n'avez pas de conflits, vous pouvez juste git stash à nouveau après avoir testé vos modifications.

Si vous avez des conflits, ne vous inquiétez pas, git reset --hard ne les perdra pas, car " L'application de l'état peut échouer en cas de conflit ; dans ce cas, il n'est pas supprimé de la liste de la cachette. Vous devez résoudre les conflits à la main et appeler git stash drop manuellement par la suite."

0voto

SeanKPS Points 373

Pour moi, j'avais juste tapé le mauvais nom du dépôt lors de la vérification. Donc il n'y avait littéralement pas de dépôt à retirer.

Donc, en plus de vérifier le casing, vérifiez le nom de la branche orthographe ou mieux encore, copiez et collez-la - pour l'exclure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X