Comment annuler un git merge de squash?
Je viens de faire un
git merge --squash feature-branch
dans mon develop
branche.
Le problème est que la commande ci-dessus mis à jour la tête sans la création d'un nouveau commit. Mon intention était de créer un seul s'engagent à appliquer à la tête de develop
.
Donc, en bref, le journal de la develop
branche avant et après la fusion sont exactement les mêmes.
Est-il un moyen de revenir develop
à ce qu'il était avant la git merge
?
Merci.
Solution
Basé sur le commentaire de Dan D. et accepté la réponse ci-dessous, j'ai pu résoudre mon problème. Voir ci-dessous ce que j'ai fait dans le cas où vous êtes dans le même bateau:
1 - j'ai couru git reflog
et la liste de toutes les validations et les caisses que j'ai fait avec mon develop
branche.
2 - au Lieu de faire un git reset HEAD@{1}
comme suggéré, j'ai trouvé le numéro quand j'ai fait la dernière s'engagent à élaborer que je voulais garder. Dans mon cas, c'était HEAD@{188}
. Donc j'ai tapé git reset HEAD@{188}
.
3 - j'ai couru un git log
et qu'il avait une propre journal ne montrant que les commits que j'avais avant j'ai fait le mauvais fusion.
4 - j'ai couru git add -A .
à tous les stades, de nouveaux fichiers créés au cours de mon développement.
5 - j'ai couru git commit -m "install feature-x"
6 - suite maintenant, j'ai de la branche develop
avec les fichiers corrects et que le journal est propre - montrant un commit pour tous les changements que j'ai fait pendant le développement de feature-x
.
J'ai encore besoin de savoir pourquoi mon original git merge --squash feature-branch
n'a pas fonctionné comme prévu.
Solution 2
Marque Longair réponse est une solution définitive à mon problème. Je viens de tester et cela fonctionne. Voir ci-dessous le processus, je me sers maintenant de squash tous les internes s'engage dans un feature-branch
et d'inclure seulement un commit à la develop
branche:
git checkout develop
git merge --squash feature-branch
git commit -m "install of feature-branch"
La séquence ci-dessus fonctionne comme un charme.
git reflog
.OriginalL'auteur jdias | 2011-09-17
Vous devez vous connecter pour publier un commentaire.
Si vous exécutez
git merge --squash <other-branch>
l'arbre de travail et les index sont mis à jour avec ce que le résultat de la fusion serait, mais il ne crée pas la commettre. Tout ce que vous devez faire est d'exécuter:Cependant, si vous changez d'avis avant de vous engager et vous voulez juste pour annuler la fusion, vous pouvez simplement exécuter:
Vous n'avez pas besoin d'utiliser le reflog.
Viens de tester et ça fonctionne. Merci Mark. J'ai juste mis à jour à ma question avec votre réponse.
+1 Autre thinko à résoudre. Thx! (un peu frustré remarque: c'est parce que dans toutes les sous-commandes git se comporter légèrement de façon incohérente - fusion, stash s'appliquent, de la caisse avec les changements locaux, tous se comportent différemment. Sans parler de la pléthore de
git checkout HEAD --
vsgit checkout HEAD -- .
,git rebase --abort
, mais pasgit merge --abort
,git push --all
, mais pasgit pull --all
et de nombreuses instances comme ça :))oui, je sais ce que tu veux dire - git est si élégant jusqu'à l'invocation à la ligne de commande...
OriginalL'auteur Mark Longair
Si vous changez d'avis avant de vous engager, vous avez les options suivantes:
Annuler la fusion avec moderne git syntaxe:
Et avec l'ancienne syntaxe:
Et vraiment old-school:
Mais en fait, il est intéressant de remarquer que
git merge --abort
est seulement équivalent àgit reset --merge
étant donné queMERGE_HEAD
est présent. Cela peut être lu dans le git de l'aide pour la commande de fusion.Après l'échec d'une fusion, quand il n'y a pas de
MERGE_HEAD
, l'échec de la fusion peut être annulée avecgit reset --merge
mais pas nécessairement avecgit merge --abort
, de sorte qu'ils ne sont pas seulement l'ancienne et la nouvelle syntaxe pour la même chose. Personnellement, je trouvegit reset --merge
beaucoup plus utile dans le travail quotidien.OriginalL'auteur Martin G