web-dev-qa-db-fra.com

Comment annuler un commit de fusion déjà poussé vers une branche distante?

git revert <commit_hash> seul ne fonctionnera pas. -m doit être spécifié, et je suis assez confus à ce sujet.

Quelqu'un a déjà vécu cela?

654
Yaz

L'option -m spécifie le numéro parent . En effet, une validation de fusion a plusieurs parents et Git ne sait pas automatiquement quel parent était la ligne principale et quel parent était la branche que vous souhaitez annuler la fusion.

Lorsque vous affichez un commit de fusion dans la sortie de git log, ses parents sont répertoriés sur la ligne commençant par Merge:

commit 8f937c683929b08379097828c8a04350b9b8e183
Merge: 8989ee0 7c6b236
Author: Ben James <[email protected]>
Date:   Wed Aug 17 22:49:41 2011 +0100

Merge branch 'gh-pages'

Conflicts:
    README

Dans ce cas, git revert 8f937c6 -m 1 vous donnera l'arborescence telle qu'elle était dans 8989ee0 et git revert -m 2 la rétablira telle qu'elle était dans 7c6b236.

Pour mieux comprendre les ID parents, vous pouvez exécuter:

git log 8989ee0 

et 

git log 7c6b236
798
Ben James

Voici un exemple complet dans l'espoir que cela aide quelqu'un:

git revert -m 1 <commit-hash> 
git commit -m "Reverting the last commit which messed the repo."
git Push -u Origin master

<commit-hash> est la valeur de validation de la fusion que vous souhaitez rétablir, et comme indiqué dans l'explication de cette réponse , -m 1 indique que vous souhaitez revenir à l'arborescence du premier parent avant la fusion. .

La ligne git commit ... valide essentiellement vos modifications tandis que la troisième ligne les rend publiques en les transmettant à la branche distante.

279
Saheed

Ben vous a dit comment annuler un commit de fusion, mais il est très important de vous rendre compte que cela "déclare que vous ne voudrez jamais que les modifications de l'arborescence soient importées" Par conséquent, les fusions ultérieures n'entraîneront que les modifications d'arborescence introduites par des commits qui ne sont pas des ancêtres de la fusion précédemment annulée. Cela peut être ou ne pas être ce que vous voulez. " (page de manuel de git-merge) .

Un article/message de liste de diffusion lié à la page de manuel détaille les mécanismes et les considérations qui sont impliqués. Assurez-vous simplement que vous comprenez que si vous annulez le commit de fusion, vous ne pouvez pas simplement fusionner la branche à nouveau plus tard et attendre les mêmes changements.

156
Ryan Stewart
git revert -m 1 <merge-commit>
33
Neeraj Kumar

Pour garder le journal propre car rien ne s'est passé (avec quelques inconvénients avec cette approche (due à Push -f)):

git checkout <branch>
git reset --hard <commit-hash-before-merge>
git Push -f Origin HEAD:<remote-branch>

'commit-hash-before-merge' provient du journal (git log) après la fusion.

16
nvd

Parfois, le moyen le plus efficace de revenir en arrière est de prendre du recul et de remplacer.

git log

Utilisez le hash 2nd commit (le hash complet, celui auquel vous voulez revenir, avant que l'erreur ne soit listée), puis reconnectez-le à partir de là.

git checkout -b newbranch <HASH>

Supprimez ensuite l'ancienne branche, copiez la nouvelle filiale à sa place et redémarrez à partir de là.

git branch -D oldbranch
git checkout -b oldbranch newbranch

Si elle a été diffusée, supprimez l’ancienne branche de tous les référentiels, poussez la branche refaite au plus central, puis ramenez-la à tous.

14
ppostma1

Si vous voulez annuler un commit merge, voici ce que vous devez faire.

  1. Tout d’abord, vérifiez le git log pour trouver l’id de votre commit de fusion. Vous trouverez également plusieurs identifiants de parents associés à la fusion (voir image ci-dessous).

enter image description here

Notez le numéro de validation de fusion affiché en jaune. Les ID parents sont ceux écrits dans la ligne suivante sous la forme Merge: parent1 parent2. À présent...

Histoire courte:

  1. Basculer vers la branche sur laquelle la fusion a été effectuée. Ensuite, faites juste le git revert <merge commit id> -m 1 qui ouvrira une console vi pour la saisie du message de validation. Ecrivez, enregistrez, quittez, faites!

Longue histoire:

  1. Basculer vers la branche sur laquelle la fusion a été effectuée. Dans mon cas, il s’agit de la branche test et j’essaie d’enlever la branche feature/analytics-v3.

  2. git revert est la commande qui annule toute validation. Mais il y a un truc désagréable quand annuler un commit merge. Vous devez entrer le drapeau -m sinon il échouera. À partir de là, vous devez décider si vous souhaitez rétablir votre branche et lui donner l’impression qu’elle était exactement telle qu’elle était sur parent1 ou parent2 via:

git revert <merge commit id> -m 1 (retourne à parent2)

git revert <merge commit id> -m 2 (retourne à parent1)

Vous pouvez vous connecter à ces parents pour déterminer le chemin que vous souhaitez emprunter et c'est la source de toute confusion.

2
saran3h

La réponse correctement marquée a fonctionné pour moi, mais j'ai dû prendre un peu de temps pour déterminer ce qui se passait. J'ai donc décidé d'ajouter une réponse en procédant par étapes simples et directes pour des cas comme le mien ..

Disons que nous avons les branches A et B .. Vous avez fusionné la branche A dans la branche B et poussé la branche B sur elle-même. La fusion en fait maintenant partie intégrante. Mais vous voulez revenir au dernier commit avant la fusion .. Que faire?

  1. Allez dans votre dossier racine git (le dossier du projet en général) et utilisez git log
  2. Vous verrez l'historique des validations récentes - les validations ont des propriétés commit/author/date, tandis que les fusions ont également une propriété de fusion - vous les voyez ainsi:

    commit: <commitHash> Merge: <parentHashA> <parentHashB> Author: <author> Date: <date>

  3. Utilisez git log <parentHashA> et git log <parentHashB> - vous verrez les historiques de validation de ces branches parentes - les premiers validés de la liste sont les derniers

  4. Prenez le <commitHash> du commit que vous voulez, allez dans votre dossier racine git et utilisez git checkout -b <newBranchName> <commitHash> - cela créera une nouvelle branche à partir du dernier commit que vous avez choisi avant la fusion .. Voila, prêt!

J'ai trouvé la création d'un patch inversé entre deux points de terminaison connus et l'application de ce patch fonctionnerait. Cela suppose que vous avez créé des instantanés (tags) à partir de votre branche maître ou même une sauvegarde de votre branche maître, par exemple, master_bk_01012017.

Supposons que la branche de code que vous avez fusionnée en maître était mycodebranch.

  1. Maître de caisse.
  2. Créez un patch inverse binaire complet entre le maître et votre sauvegarde .git diff --binary master..master_bk_01012017 > ~/myrevert.patch
  3. Vérifiez votre patch git apply --check myrevert.patch
  4. Appliquer le correctif avec signature git am --signoff < myrevert.patch
  5. Si vous devez réintroduire ce code une fois qu'il est corrigé, vous devrez dériver le maître rétabli et extraire la branche de correctif git branch mycodebranch_fixgit checkout mycodebranch_fix
  6. Ici, vous devez trouver la touche SHA pour annuler et inverser l’inverse git revert [SHA]
  7. Maintenant, vous pouvez utiliser votre mycodebranch_fix pour résoudre les problèmes, valider et fusionner à nouveau dans master une fois terminé.
1
alexplain

Toutes les réponses couvraient déjà la plupart des choses, mais je vais ajouter mes 5 centimes. En bref, révoquer un commit de fusion est assez simple:

git revert -m 1 <commit-hash>

Si vous en avez l'autorisation, vous pouvez le placer directement dans la branche "maître", sinon, il vous suffit de le placer dans votre branche "revenir" et de créer une demande d'extraction.

Vous trouverez peut-être d'autres informations utiles à ce sujet ici: https://itcodehub.blogspot.com/2019/06/how-to-revert-merge-in-git.html

0
xproph

git doc à propos de git revert -m fournit un lien expliquant exactement ceci: https://github.com/git/git/blob/master/Documentation/howto/revert-a-faulty-merge.txt

0
Junyong