Annuler git stash pop qui entraîne un conflit de fusion

520

J'ai commencé à apporter des modifications à ma base de code, ne réalisant pas que j'étais sur une ancienne branche de sujet. Pour les transférer, je voulais les ranger puis les appliquer à une nouvelle branche hors master. J'avais l'habitude git stash popde transférer des modifications en cours vers cette nouvelle branche, oubliant que je n'avais pas apporté de nouvelles modifications dans master avant de créer la nouvelle branche. Cela a entraîné un tas de conflits de fusion et la perte d'une cachette propre de mes modifications (depuis que j'ai utilisé pop).

Une fois que j'ai recréé la nouvelle branche correctement, comment puis-je récupérer mes modifications cachées pour les appliquer correctement?

acjay
la source

Réponses:

658

En fin de compte, Git est assez intelligent pour ne pas laisser de cachette s'il ne s'applique pas proprement. J'ai pu atteindre l'état souhaité avec les étapes suivantes:

  1. Pour supprimer les conflits de fusion: git reset HEAD .(notez le point de fin)
  2. Pour enregistrer la fusion en conflit (juste au cas où): git stash
  3. Pour revenir au maître: git checkout master
  4. Pour extraire les dernières modifications: git fetch upstream; git merge upstream/master
  5. Pour corriger ma nouvelle branche: git checkout new-branch; git rebase master
  6. Pour appliquer les changements cachés corrects (maintenant 2e sur la pile): git stash apply stash@{1}
acjay
la source
14
Excellent, merci! # 6 est vraiment la réponse que je cherchais. Pourrait ajouter un git stash dropcomme dernière étape pour se débarrasser de la cachette indésirable de # 2.
austinmarton
2
# 2 ne fonctionnera pas s'il y a des chemins non fusionnés, il produira à la place l'erreur décrite ici: stackoverflow.com/questions/5483213/…
Étienne
5
Pas totalement vrai - Git gardera la cachette dans la liste de cachettes si elle ne s'applique pas proprement. Consultez ces documents sur git stash pop: "L'application de l'état peut échouer avec des conflits; dans ce cas, il n'est pas supprimé de la liste de dissimulation. Vous devez résoudre les conflits à la main et appeler git stash dropmanuellement par la suite." ( git-scm.com/docs/git-stash )
Carolyn Conway
4
Étrange comment cette réponse et la question sont affichées à la même minute exacte
appelez-moi
14
@ call-me C'est quelque chose que je pense que les gens devraient faire plus souvent! Remarquez comment le formulaire «Poser une question» comporte une case à cocher qui vous permet de répondre à votre propre question dans le même formulaire :). Cela m'arrive parfois lorsque je suis en train de créer une question qui me bloque, mais en essayant de régler la question pour qu'elle soit bonne pour StackOverflow, je finis par trouver la solution. C'était il y a un certain temps, donc je ne me souviens pas si c'était le cas ici, mais je suppose que c'est ce qui s'est passé.
2018
342

Heureusement git stash pop cela ne change pas la cachette en cas de conflit!

Donc, ne vous inquiétez pas, nettoyez simplement votre code et réessayez.

Supposons que votre base de code était propre avant, vous pouvez revenir à cet état avec: git checkout -f
Ensuite, faites ce que vous avez oublié, par exemple git merge missing-branch
après avoir simplement déclenchégit stash pop , tirez à nouveau et vous obtenez la même cachette, qui était en conflit auparavant.

Attention: La cachette est sûre, cependant, les modifications non validées dans le répertoire de travail ne le sont pas. Ils peuvent se gâcher.

flori
la source
16
Ce que je comprends, c'est que vous pouvez simplement nettoyer et sauter à nouveau, mais vous ne pouvez pas l' annuler . Si la pop se mélange avec d'autres modifications non validées, vous devez nettoyer manuellement.
haridsv
Ceci est une solution très simple et a très bien fonctionné pour moi. Cela suppose que vous pouvez annuler tout ce qui a changé localement (il n'y a eu aucun changement avant / après que la cachette a été sautée), ce qui, je pense, fonctionne pour la plupart des situations. Si vous avez besoin d'enregistrer des modifications supplémentaires qui se sont produites avant de vous rendre compte qu'il s'agissait d'un problème, vous devriez pouvoir valider ces fichiers avant de forcer une extraction dans la plupart des cas.
Project707
Ce n'était pas le cas pour moi. Je l'ai appelé git stash poptenté de fusionner automatiquement, en conflit et l' ai conservé.
Trevor Hickey
1
@TrevorHickey Le point de cette réponse était que la cachette reste telle qu'elle est en cas de conflit, que vous pouvez appeler git stash popaussi souvent que nécessaire jusqu'à la fin sans conflit. Donc, après votre conflit, oui, le répertoire de travail est en désordre, cependant, vous pouvez le nettoyer et appeler à git stash popnouveau.
flori
5
cette commande pour annuler l'application du dernier stash est très utile git checkout -f:!
Lefi Tarik
16

Les instructions sont un peu compliquées, je vais donc proposer quelque chose de plus simple:

  1. git reset HEAD --hard Abandonner toutes les modifications apportées à la branche actuelle

  2. ... Effectuer des travaux intermédiaires si nécessaire

  3. git stash pop Re-pop la cachette à une date ultérieure lorsque vous êtes prêt

anon58192932
la source
8
git checkout -f

doit fonctionner, si votre état précédent est propre.

Allahbakash.G
la source