web-dev-qa-db-fra.com

Annulation accidentelle de la pop cachée git

J'ai caché quelques modifications locales avant de faire une fusion compliquée, ai fait la fusion, puis j'ai bêtement oublié de valider avant de lancer git stash pop. La pop a créé des problèmes (appels de méthode incorrects dans une grande base de code) qui se révèlent difficiles à dépister. J'ai couru git stash show, donc je sais au moins quels fichiers ont été modifiés. Si rien d’autre, j’imagine que c’est une leçon à retenir.

Ma question: est-il possible d'annuler le stash pop sans annuler la fusion?

172
nren

Essayez d'utiliser Comment récupérer une réserve cachée dans Git? pour trouver la réserve que vous avez trouvée. Je pense qu'il y a toujours deux commits pour une réserve, car cela préserve l'index et la copie de travail (le commit de l'index sera souvent vide). Ensuite git show les pour voir le diff et utiliser patch -R pour les désappliquer.

66
Ben Jackson

De git stash --help

Recovering stashes that were cleared/dropped erroneously
   If you mistakenly drop or clear stashes, they cannot be recovered through the normal safety mechanisms. However, you can try the
   following incantation to get a list of stashes that are still in your repository, but not reachable any more:

       git fsck --unreachable |
       grep commit | cut -d\  -f3 |
       xargs git log --merges --no-walk --grep=WIP

Cela m'a aidé mieux que la réponse acceptée avec le même scénario.

34
kachar

Si votre fusion n'était pas trop compliquée, une autre option serait de:

  1. Déplacez toutes les modifications, y compris les modifications de fusion, vers stash à l'aide de "git stash"
  2. Exécutez à nouveau la fusion et validez vos modifications (sans les modifications de la cachette déposée).
  3. Exécutez un "git stash pop" qui devrait ignorer toutes les modifications de votre fusion précédente car les fichiers sont maintenant identiques.

Après cela, il ne vous reste que les modifications de la réserve que vous avez abandonnée trop tôt.

1
markus