J'ai trouvé une bonne explication pour annuler la fusion à partir de ce lien et j'ai copié collé l'explication ci-dessous et il serait utile au cas où le lien ci-dessous ne fonctionne pas.
Comment
annuler une fusion défectueuse Alan (alan@clueserver.org) a déclaré:
J'ai une branche principale. Nous avons une branche sur laquelle certains développeurs travaillent. Ils prétendent qu'il est prêt. Nous le fusionnons dans la branche principale. Il casse quelque chose donc nous revenons à la fusion. Ils apportent des modifications au code. ils parviennent à un point où ils disent que c'est ok et nous fusionnons à nouveau. Une fois examinés, nous constatons que les modifications de code effectuées avant le retour ne sont pas dans la branche principale, mais les modifications de code après sont dans la branche principale. et a demandé de l'aide pour se remettre de cette situation.
L'histoire immédiatement après le "retour de la fusion" ressemblerait à ceci:
---o---o---o---M---x---x---W
/
---A---B
où A et B sont sur le développement latéral qui n'était pas si bon, M est la fusion qui apporte ces changements prématurés dans la ligne principale, x sont des changements sans rapport avec ce que la branche latérale a fait et déjà effectués sur la ligne principale, et W est le " annuler la fusion M "(W ne regarde-t-il pas M à l'envers?). IOW, "diff W ^ .. W" est similaire à "diff -RM ^ .. M".
Un tel "retour" d'une fusion peut être effectué avec:
$ git revert -m 1 M Une
fois que les développeurs de la branche latérale ont corrigé leurs erreurs, l'historique peut ressembler à ceci:
---o---o---o---M---x---x---W---x
/
---A---B-------------------C---D
où C et D doivent réparer ce qui a été cassé en A et B, et vous pouvez déjà avoir d'autres changements sur la ligne principale après W.
Si vous fusionnez la branche latérale mise à jour (avec D à son extrémité), aucune des modifications apportées dans A ou B ne sera dans le résultat, car elles ont été annulées par W. C'est ce qu'Alan a vu.
Linus explique la situation:
La restauration d'un commit régulier annule simplement ce que ce commit a fait et est assez simple. Mais l'annulation d'un commit de fusion annule également les données modifiées par le commit, mais cela n'a absolument rien à voir avec les effets sur l' historique de la fusion. Ainsi, la fusion existera toujours, et elle sera toujours considérée comme joignant les deux branches, et les futures fusions verront cette fusion comme le dernier état partagé - et le retour qui a annulé la fusion apportée n'affectera pas du tout cela. Donc, un "retour" annule les modifications de données, mais ce n'est pas du tout un "défaire" dans le sens où il n'annule pas les effets d'un commit sur l'historique du référentiel. Donc, si vous pensez à "revenir" comme "annuler", alors vous allez toujours manquer cette partie des retours. Oui, cela annule les données, mais non, il n'annule pas l'historique. Dans une telle situation, vous voudrez d'abord revenir à la précédente, ce qui donnerait à l'histoire l'aspect suivant:
---o---o---o---M---x---x---W---x---Y
/
---A---B-------------------C---D
où Y est le retour de W. Un tel "retour du retour" peut se faire avec:
$ git revert W
Cet historique (en ignorant les conflits possibles entre ce que W et W..Y ont changé) équivaudrait à ne pas avoir du tout W ou Y dans l'historique:
---o---o---o---M---x---x-------x----
/
---A---B-------------------C---D
et la fusion à nouveau de la branche latérale n'aura pas de conflit résultant d'un retour antérieur et d'un retour du retour.
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
Bien sûr, les modifications apportées en C et D peuvent toujours entrer en conflit avec ce qui a été fait par l'un des x, mais ce n'est qu'un conflit de fusion normal.