Question Annuler une fusion Git qui n'a pas encore été poussée


Au sein de ma branche maîtresse, j'ai fait un git merge some-other-branch localement, mais n'a jamais poussé les changements à l'origine maître. Je ne voulais pas fusionner, alors j'aimerais le défaire. En faisant un git status après ma fusion, je recevais ce message:

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.

Basé sur certains instructions que j'ai trouvéesJ'ai essayé de courir

git revert HEAD -m 1

mais maintenant je reçois ce message avec git status:

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

Je ne veux pas que ma branche soit en avance par un nombre de commits. Comment est-ce que je reviens à ce point?


3075
2018-03-05 19:24


origine


Réponses:


Avec git reflog vérifier quel commit est un avant la fusion (git reflog sera une meilleure option que git log). Ensuite, vous pouvez le réinitialiser en utilisant:

git reset --hard commit_sha

Il y a aussi une autre façon

git reset --hard HEAD~1

vous ramènera 1 commit.

Sachez que tous les fichiers modifiés et non validés / non annulés seront réinitialisés à leur état non modifié. Pour les garder soit cacher les changements loin ou voir --merge option ci-dessous.


Comme @Velmont suggéré ci-dessous dans sa réponse, dans ce cas direct en utilisant:

git reset --hard ORIG_HEAD

pourrait donner de meilleurs résultats, car il devrait préserver vos changements. ORIG_HEAD pointe vers un commit directement avant que la fusion ne se produise, donc vous n'avez pas besoin de le chercher vous-même.


Un autre conseil est d'utiliser le --merge passer au lieu de --hard car il ne réinitialise pas les fichiers inutilement:

--fusionner

Réinitialise l'index et met à jour les fichiers dans l'arbre de travail qui sont différents entre <commit> et HEAD, mais conserve ceux qui sont différents entre l'index et l'arbre de travail (c'est-à-dire qui ont des changements qui n'ont pas été ajoutés).


3368
2018-03-05 19:34



En supposant que votre maître local n'était pas en avance sur l'origine / maître, vous devriez être capable de faire

git reset --hard origin/master

Ensuite, votre locale master branche devrait ressembler à origin/master.


1289
2018-03-17 18:06



Voir chapitre 4 dans le livre Git et le message original de Linus Torvalds.

Pour annuler une fusion c'était déjà poussé:

git revert -m 1 commit_hash

Assurez-vous de revenir à la version précédente si vous recommencez la branche, comme l'a dit Linus.


1083
2018-06-02 16:31



Il est étrange que la commande la plus simple manquait. La plupart des réponses fonctionnent, mais en annulant la fusion que vous venez de faire, c'est la manière facile et sûre:

git reset --merge ORIG_HEAD

L'arbitre ORIG_HEAD pointera sur le commit d'origine avant la fusion.

(Le --merge L'option n'a rien à voir avec la fusion. C'est comme git reset --hard ORIG_HEAD, mais plus sûr car il ne touche pas aux changements non validés.)


831
2018-01-29 15:46



Avec les nouvelles versions de Git, si vous n'avez pas encore validé la fusion et vous avez un conflit de fusion, vous pouvez simplement faire:

git merge --abort

De man git merge:

[Ceci] ne peut être exécuté qu'après que la fusion a entraîné des conflits. git merge --abort abandonnera le processus de fusion et essaiera de reconstruire l'état de pré-fusion.


306
2018-02-12 02:13



Vous devriez réinitialiser à la validation précédente. Cela devrait fonctionner:

git reset --hard HEAD^

Ou même HEAD^^ pour revenir à cette inversion de validation. Vous pouvez toujours donner une référence SHA complète si vous n'êtes pas sûr du nombre de pas en arrière que vous devriez prendre.

Dans le cas où vous rencontrez des problèmes et que votre branche maîtresse n'a subi aucune modification locale, vous pouvez réinitialiser origin/master.


104
2018-03-05 19:31



Dernièrement, j'ai utilisé git reflog pour aider avec ça. Cela ne fonctionne que si la fusion vient juste de se produire, et c'est sur votre machine.

git reflog pourrait renvoyer quelque chose comme:

fbb0c0f HEAD@{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 HEAD@{1}: checkout: moving from master to my-branch
e3753a7 HEAD@{2}: rebase finished: returning to refs/heads/master
e3753a7 HEAD@{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 HEAD@{4}: reset: moving to HEAD^
8400a0f HEAD@{5}: rebase: aborting

La première ligne indique qu'une fusion s'est produite. La deuxième ligne est le temps avant ma fusion. Je, simplement git reset --hard 43b6032 pour forcer cette branche à suivre d'avant la fusion, et continuer.


78
2017-12-19 17:51



Avec Git moderne, vous pouvez:

git merge --abort

Ancienne syntaxe:

git reset --merge

Vieille école:

git reset --hard

Mais en fait, il vaut la peine de noter que git merge --abort est seulement équivalent à git reset --merge étant donné que MERGE_HEAD est présent. Cela peut être lu dans la commande Git help for merge.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

Après une fusion échouée, quand il n'y a pas MERGE_HEAD, la fusion échouée peut être annulée avec git reset --merge, mais pas nécessairement avec git merge --abort, donc ils ne sont pas seulement ancienne et nouvelle syntaxe pour la même chose.

Personnellement je trouve git reset --merge beaucoup plus puissant et utile dans le travail quotidien, c'est donc celui que j'utilise toujours.


42
2018-05-08 19:13



D'accord, les réponses que d'autres personnes m'ont données étaient proches, mais ça n'a pas marché. Voici ce que j'ai fait.

Ce faisant...

git reset --hard HEAD^
git status

... m'a donné le statut suivant.

# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.

J'ai ensuite dû taper le même git reset commande plusieurs autres fois. Chaque fois que je l'ai fait, le message a changé d'un comme vous pouvez le voir ci-dessous.

> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.

À ce stade, j'ai vu le message d'état changé, alors j'ai essayé de faire un git pull, et cela a semblé fonctionner:

> git pull
Updating 2df6af4..12bbd2f
Fast forward
 app/views/truncated |    9 ++++++---
 app/views/truncated |   13 +++++++++++++
 app/views/truncated |    2 +-
 3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master

Bref, en bref, mes commandements se résument à ceci:

git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull

32
2018-03-05 19:54



Vous pourriez utiliser git reflog pour trouver la caisse précédente. Parfois, c'est un bon état auquel vous voulez revenir.

Concrètement,

$ git reflog
$ git reset --hard HEAD@{0}

21
2018-01-17 22:36



Si vous ne l'avez pas encore validé, vous ne pouvez utiliser que

$ git checkout -f

Cela annulera la fusion (et tout ce que vous avez fait).


12
2018-01-18 15:25