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

dans ma branche principale, j'ai fait un git merge some-other-branch localement, mais je n'ai jamais poussé les changements au maître d'origine. Je ne voulais pas fusionner, alors j'aimerais le défaire. En faisant un git status après ma Fusion, j'ai eu ce message:

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

basé sur quelques instructions j'ai trouvé , j'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.

I Je ne veux pas que ma branche soit en avance sur un nombre quelconque de commits. Comment puis-je revenir à ce point?

3163
demandé sur emii 2010-03-05 22:24:44

26 réponses

avec git reflog vérifiez qui commit est un avant la fusion(git reflog sera 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.

soyez conscient que tous les fichiers modifiés et non engagés/non effacés seront réinitialisés dans leur état non modifié . Pour les garder, soit les changements de cachette loin, soit voir --merge option ci-dessous.


comme @Velmont l'a 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 pointera vers un commit directement avant la fusion, donc vous n'avez pas à le chercher vous-même.


une autre astuce consiste à utiliser le commutateur --merge au lieu de --hard puisqu'il ne réinitialise pas les fichiers inutilement:

--merge

réinitialise l'index et met à jour les fichiers de l'arbre de travail qui sont différents entre et HEAD, mais conserve ceux qui sont différents entre l'index et l'arbre de travail (c'est-à-dire qui ont des modifications qui n'ont pas été ajoutées).

3484
répondu Marcin Gil 2018-03-07 10:08:23

en supposant que votre capitaine local n'était pas en avance sur l'origine / le capitaine, vous devriez être en mesure de faire

git reset --hard origin/master

alors votre succursale locale master devrait ressembler à origin/master .

1306
répondu randomguy3 2012-01-16 18:07:32

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

pour annuler une fusion qui avait déjà été poussée :

git revert -m 1 commit_hash

assurez-vous de revenir en arrière si vous commettez à nouveau la branche, comme Linus l'a dit.

1093
répondu Yuri Geinish 2017-01-14 15:24:47

il est étrange que la commande la plus simple ait été manquante. La plupart des réponses fonctionnent, mais annuler la fusion que vous venez de faire, c'est la manière facile et sûre :

git reset --merge ORIG_HEAD

ref ORIG_HEAD sera point à l'original commettre d'avant la fusion.

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

861
répondu odinho - Velmont 2017-01-14 15:33:02

avec les nouvelles versions de Git, si vous n'avez pas encore commis la fusion et que vous avez un conflit de fusion , vous pouvez simplement faire:

git merge --abort

de man git merge :

[Ce] ne peuvent être exécutés qu'après la fusion a entraîné dans des conflits. git merge --abort va annuler le processus de fusion et essayer de reconstruire l'état de pré-fusion.

317
répondu Travis Reeder 2017-04-20 11:18:39

Vous devez réinitialiser la précédente livraison. Cela devrait fonctionner:

git reset --hard HEAD^

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

dans le cas où vous avez des problèmes et votre branche principale n'a pas eu de changements locaux, vous pouvez réinitialiser à origin/master .

108
répondu MBO 2017-01-14 15:17:06

dernièrement, j'ai utilisé git reflog pour aider avec ça. Ça ne marche que si la fusion a eu lieu, et que c'était sur votre machine.

git reflog pourrait retourner 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. J'ai simplement git reset --hard 43b6032 pour forcer cette branche à suivre avant la fusion, et continuer.

79
répondu Parris 2014-12-19 17:51:41

avec Git moderne, vous pouvez:

git merge --abort

ancienne syntaxe:

git reset --merge

de la Vieille école:

git reset --hard

mais en fait, il est intéressant 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 l'aide Git pour la commande merge.

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

après une fusion ratée, quand il n'y a pas de MERGE_HEAD , la fusion ratée peut être annulée avec git reset --merge , mais pas nécessairement avec git merge --abort , de sorte qu'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, donc c'est celui que j'utilise toujours.

45
répondu Martin G 2017-01-14 15:37:49

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

cela...

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 plusieurs fois la même commande git reset . Chaque fois que j'ai fait cela, le message a changé par un comme vous pouvez 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 point, j'ai vu le message d'état changé, donc 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

pour faire court, mes ordres se résument à ceci:

git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull
33
répondu Matt Huggins 2017-01-14 15:22:17

vous pouvez utiliser git reflog pour trouver la caisse précédente. Parfois, c'est un bon état que vous souhaitez retourner.

concrètement,

$ git reflog
$ git reset --hard HEAD@{0}
21
répondu stephjang 2014-01-17 22:36:18

si vous ne l'avez pas encore engagé, vous ne pouvez utiliser que

$ git checkout -f

il défera la fusion (et tout ce que vous avez fait).

12
répondu Idealmind 2013-01-18 15:25:37

juste pour une option supplémentaire à regarder, j'ai été la plupart du temps en suivant le modèle de branchement décrit ici: http://nvie.com/posts/a-successful-git-branching-model / et comme tels ont fusionné avec --no-ff (pas de fast forward) habituellement.

je viens de lire cette page car j'avais accidentellement fusionné une branche testing au lieu de ma branche release avec master for deploying (site web, master is what is live). La direction des essais a deux autres les branches ont fusionné avec elle et totalisent environ six commits.

donc pour revenir à la version complète j'ai juste eu besoin d'un git reset --hard HEAD^ et cela a inversé toute la fusion. Comme les fusions n'ont pas été transmises rapidement, la fusion était un bloc et un pas en arrière est "branche non fusionnée".

10
répondu Damien Byrne 2011-06-09 00:54:52

vous ne pouvez utiliser que deux commandes pour revenir à une fusion ou redémarrer par une propagation spécifique:

  1. git reset --hard commitHash (vous devez utiliser le commit que vous voulez redémarrer, par exemple. 44a587491e32eafa1638aca7738)
  2. git push origin HEAD --force (envoi de la nouvelle branche maître locale à origin/master)

Bonne chance et allez de l'avant!

10
répondu Matheus Abreu 2014-12-13 00:27:15

est arrivé à cette question également en cherchant à revenir à l'origine de match (c'est-à-dire, pas de commits avant l'origine). En cherchant plus loin, j'ai trouvé qu'il y a une commande reset pour exactement cela:

git reset --hard @{u}

Note: @{u} est une abréviation de origin/master . (Et, bien sûr, vous avez besoin de dépôt distant pour que cela fonctionne.)

10
répondu leanne 2017-02-16 21:54:41

la réponse la plus simple est celle donnée par odinho-Velmont

d'Abord faire git reset --merge ORIG_HEAD

pour ceux qui cherchent à réinitialiser après avoir poussé les changements, faites ceci (Parce que c'est le premier message vu pour toutes les questions git reset merge)

git push origin HEAD --force

cela va se réinitialiser de telle sorte que vous n'obtiendrez pas les modifications fusionnées à nouveau après pull.

6
répondu Harsha 2017-11-02 23:28:56

si votre Fusion et les propagations correspondantes n'ont pas encore été poussées, vous pouvez toujours passer à une autre branche, supprimer la première et la recréer.

par exemple, j'ai accidentellement fusionné une branche en développement en master et j'ai voulu annuler cela. En utilisant les étapes suivantes:

git checkout develop
git branch -D master
git branch -t master origin/master

voilà! Le maître est au même stade que l'origine, et votre état mal fusionné est effacé.

5
répondu Stephan 2017-01-14 15:26:24

si vous voulez une solution en ligne de commande, je vous suggère de suivre la réponse de MBO.

si vous êtes un débutant, vous pourriez aimer l'approche graphique:

  1. coup D'envoi gitk (à partir de la ligne de commande, ou clic droit dans le navigateur de fichier si vous avez cela)
  2. vous pouvez facilement repérer le commit de fusion - le premier noeud à partir du haut avec deux parents
  3. suivre le lien vers le parent premier/gauche (celui sur votre branche actuelle avant la fusion, habituellement rouge pour moi)
  4. sur la propagation sélectionnée, droit-cliquez sur "Réinitialiser la branche ici", choisissez la réinitialisation dure là
4
répondu inger 2017-01-14 15:36:08

stratégie: créer une nouvelle branche d'où tout était bon.

Rationale: revenir sur une fusion est difficile. Il y a trop de solutions, en fonction de nombreux facteurs tels que si vous avez engagé ou poussé votre fusion ou s'il y a eu de nouvelles propagations depuis votre Fusion. Vous devez également avoir une compréhension relativement profonde de git pour adapter ces solutions à votre cas. Si vous suivez aveuglément certains instructions, vous pouvez vous retrouver avec une" fusion vide "où rien ne sera fusionné, et d'autres tentatives de fusion feront Git vous dire"déjà à jour".

Solution:

disons que vous voulez fusionner dev en feature-1 .

  1. trouvez la révision que vous souhaitez recevoir la fusion:

    git log --oneline feature-1
    a1b2c3d4 Merge branch 'dev' into 'feature-1' <-- the merge you want to undo
    e5f6g7h8 Fix NPE in the Zero Point Module <-- the one before the merge, you probably want this one
    
  2. Check it (revenir en arrière dans le temps):

    git checkout e5f6g7h8
    
  3. créer une nouvelle branche à partir de là et vérifier:

    git checkout -b feature-1
    

Maintenant vous pouvez redémarrer votre Fusion:

  1. Fusionner: git merge dev

  2. réparez vos conflits de fusion.

  3. s'Engager: git commit

  4. lorsque vous êtes satisfait des résultats, supprimez l'ancienne branche: git branch --delete feature-1

4
répondu pyb 2017-01-18 18:24:35

j'ai pu résoudre ce problème avec une seule commande qui n'implique pas la recherche d'un identifiant de propagation.

git reset --hard remotes/origin/HEAD

la réponse acceptée n'a pas fonctionné pour moi mais cette commande a atteint les résultats que je cherchais.

4
répondu Ralph Ritoch 2018-07-25 09:55:26

je pense que vous pouvez faire git rebase -i [hash] [branch_name][hash] est l'identifiant de hachage, cependant, beaucoup de retour que vous souhaitez pour un retour de plus d'un (ou cependant beaucoup s'engage en arrière, vous voulez aller), puis de supprimer les lignes pour les commits dans l'éditeur que vous ne voulez pas de plus. Enregistrez le fichier. Sortie. Prier. Et il devrait être rembobiné. Vous pourriez avoir à faire un git reset --hard , mais il devrait être bon à ce point. Vous pouvez également l'utiliser pour tirer spécifiques s'engage d'une pile, si vous ne voulez pas les garder dans votre histoire, mais qui ne peut laisser votre dépôt dans un état que vous ne voulez probablement pas.

1
répondu tychoish 2010-03-10 18:48:55
  1. D'abord, assurez-vous que vous avez tout commis.

  2. puis réinitialisez votre dépôt à l'état de fonctionnement précédent:

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36
    

    ou en utilisant --hard ( ) ceci supprimera tous les changements locaux, non engagés! ):

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard
    

    utilisez le hachage qui était là avant que votre commit fusionné à tort.

  3. contrôle qui engage vous souhaitez re-commettre sur le haut de la version précédente correcte par:

    $ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    ...
    
    commit 16b373a96b0a353f7454b141f7aa6f548c979d0a
    
    ...
    
  4. Appliquer votre droit s'engage sur le haut de la bonne version de votre référentiel par:

    • à l'aide de cherry-pick (les changements introduits par certains commits)

          git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7
      
    • :

      • première vérification des changements à droite avant leur fusion:

        git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        
      • première vérification des changements de droite avant leur fusion:

        git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        

        où c'est la plage des propagations correctes que vous avez commises (à l'exclusion de la fusion faussement engagée).

1
répondu kenorb 2017-01-14 15:50:08

si vous remarquez que vous devez revenir immédiatement après la fusion et que vous n'avez rien fait d'autre après la tentative de fusion, vous pouvez simplement lancer cette commande: git reset --hard HEAD@{1} .

Essentiellement, votre fusion sha pointe HEAD@{0} si rien d'autre n'a été commis après la fusion et donc HEAD@{1} sera le point précédent avant la fusion.

0
répondu Dut A. 2016-04-26 18:52:23

le plus simple des hasards, bien plus simple que tout ce qui est dit ici:

retirez votre branche locale (locale, pas distante) et tirez-la à nouveau. De cette façon, vous annulerez les changements sur votre branche principale et n'importe qui sera affecté par le changement que vous ne voulez pas pousser. Commencer plus de.

0
répondu Luis 2016-07-15 14:16:03

si vous avez commis la fusion:

git reset HEAD~1
# Make sure what you are reverting is in fact the merge files
git add .
git reset --hard
0
répondu Dorian 2017-01-14 15:40:53

Dans ce cas, vous pouvez réinitialiser votre branche avec git reset --hard <branch_name> . Si vous voulez enregistrer vos modifications avant de les mettre à zéro eux assurez-vous de créer une nouvelle branche et git checkout <branch_name> .

vous pouvez réinitialiser l'État à un commit spécifique avec git reset --hard <commit_id> aussi.

si les changements ont été poussés, vous pouvez utiliser git revert <branch_name> à la place. Assurez-vous de vérifier comment l'utiliser git revert et git checkout dans d'autres scénarios.

0
répondu Nesha Zoric 2018-05-29 10:21:05

vous pouvez utiliser la commande git-reset.

git-reset - Réinitialiser l'actuel CHEF de l'

état spécifié. git reset [--mixte |

--mou | dur -- | --merge] [-q] [] git reset [-q] []

[ -- ] ... git reset -- patch

[] [--] [...]

git-Reset

-13
répondu NebuSoft 2012-06-08 01:21:47