2017-09-08 4 views
0

Je sais qu'il existe beaucoup d'informations sur l'annulation d'une fusion dans git, mais je n'arrive pas à trouver de consensus sur la façon de procéder dans ma situation spécifique. Quelqu'un a essentiellement fusionné notre branche develop dans notre branche master via une requête d'extraction dans bitbucket. Cela vient de se produire aujourd'hui, c'est donc la dernière chose qui a été faite sur la branche master (nous n'avons pas à nous inquiéter des autres commits en plus de la commit de fusion).Annuler une fusion git créée par une requête d'extraction bitbucket

Note: Nous hébergeons nous Bitbucket, nous avons donc une ancienne version de bitbucket. Il n'y a pas d'option de demande d'extraction de retour.

D'après ce que j'ai lu, il y a essentiellement deux façons de gérer cela dans git:

  1. git reset --hard *<SHA of commit before the merge>*

    • Cela supprimera la fusion engage comme si elle n'a jamais eu lieu. Partout j'ai lu que "c'est une mauvaise pratique de réécrire l'histoire" ou "ne jamais le faire sur un repo partagé publiquement" mais ils n'expliquent jamais vraiment pourquoi ne pas le faire. Il semble que cela va résoudre le problème, et cela ne deviendra pas un problème dans 6 mois, quand nous voulons vraiment refaire cette fusion de develop à master
    • Si c'est la meilleure façon de le faire, et nous le faisons il, ce qui se passe à la demande de traction dans bitbucket? Cette requête pull existe toujours dans bitbucket, mais nous supprimons le commit de fusion créé, de sorte que cela va gâcher bitbucket de quelque façon que ce soit?
  2. git revert -m 1 *<SHA of the merge commit>*

    • Cela va créer un nouveau commit qui supprime les changements qui ont été faites par la fusion
    • Ce serait bien, sauf que nous avons l'intention de fusionner develop dans master à une date ultérieure date (la prochaine version), et d'après ce que j'ai lu, nous devrons nous rappeler de revenir à notre inversion avant de faire cela, car sinon nous fusionnerons develop en master, les changements que nous inversons aujourd'hui ne seront pas inclus. Je ne veux vraiment pas que cela devienne un problème dans 6 mois, quand personne ne se souvient de cela.

TL; DR: Je hésite à faire git revert en raison des problèmes qu'elle pourrait causer 6 mois à partir de maintenant, lorsque nous voulons faire cette fusion à nouveau. Je suis également hésitant à faire git reset parce que tout le monde semble mettre en garde contre le faire, et il pourrait causer des problèmes avec la demande de traction sur bitbucket.

Répondre

1

Vous pouvez le faire. Il n'y a vraiment pas de raisons techniques décisives qui vous dicteraient quoi faire.

  1. Dans des cas exceptionnels, il est possible de mettre à jour le mode sans transfert. Expliquez à chacun, demandez à l'équipe qui a tiré le maître erroné, aidez-les à se rétablir.

  2. Vous pouvez transférer la branche development pour annuler la validation, puis revert the revert, retournant ainsi à son contenu.

PS pour le cas 2:

Pour le cas d'origine

* 73d5415 (HEAD -> master) master3 
| * e660100 (development) development3 
| * 0356d3a development2 
| * 6cefad0 development1 
|/ 
* 209d967 master2 
* dc25505 master1 

vous avez fusionné le development dans master, et il est revenu.

* 7a4f94a (HEAD -> master) Revert "Merge branch 'development'" 
* 75e1e34 Merge branch 'development' 
|\ 
| * e660100 (development) development3 
| * 0356d3a development2 
| * 6cefad0 development1 
* | 73d5415 master3 
|/ 
* 209d967 master2 
* dc25505 master1 

Maintenant, pour le fixer, vous shoud faire

$ git checkout development 
$ git merge --ff-only master 
$ git revert 7a4f94a (the "Revert" commit) 

Résultat:

e7b511a (HEAD -> development) Revert "Revert "Merge branch 'development'"" 
* 7a4f94a (master) Revert "Merge branch 'development'" 
* 75e1e34 Merge branch 'development' 
|\ 
| * e660100 development3 
| * 0356d3a development2 
| * 6cefad0 development1 
* | 73d5415 master3 
|/ 
* 209d967 master2 
* dc25505 master1 

e7b511a Contient tout votre développement qui était autrefois pas maître et peut être fusionné pour maîtriser plus tard . Il y a cependant un inconvénient à ce que tout cela soit représenté comme un commit unique, donc si vous voulez blâmer quelqu'un, il faudra un appel de plus en e660100.

+0

Pouvez-vous élaborer sur le numéro 2? Je ne suis pas. Surtout avec votre utilisation de "forward". Êtes-vous en train de dire qu'il y a un moyen de changer 'develop' de sorte qu'il prendra en compte le retour quand nous faisons la fusion de' develop' à 'master' dans 6 mois? –

+0

exemple ajouté avec des graphiques – max630

+0

Wow merci pour la réponse détaillée. Je vais certainement marquer cela comme la réponse acceptée, mais encore une chose. Nous ne pouvons pas faire une fusion rapide de maître à développement car il y a eu d'autres commits sur le développement depuis que nous avons fait le retour en master. Cela change-t-il quelque chose? Puis-je encore accomplir cela en faisant un commit de fusion sur develop au lieu d'une fusion fast-forward? –

0

[Comme je suis encore pour obtenir des réputations assez, je ne peux pas mettre des commentaires sur votre question, afin d'ajouter mes commentaires comme réponse]

La seule façon que je connaisse de revenir à l'ancien hachage de maître (sans montrant le commit de fusion et l'inversion de la validation) est à force-push. Reportez-vous git force-push pour des exemples et des options.

Ceci est une réponse discutable, car il y en a beaucoup avec une opinion contre. Mais comme vous utilisez bitbucket, le force-push peut être contrôlé, c'est-à-dire l'activer pour votre opération et désactiver le force-push pour votre maître.

Remarque: bitbucket derniers plugins comme rebase et squash utilisent --force-with-lease.

+0

Merci pour la réponse, mais je pense que vous ne comprenez pas ce que je demande. Je sais que je devrais faire un coup de force pour maîtriser si j'utilise 'git reset --hard', mais ma question est de savoir s'il vaut mieux faire comme ça, ou devrais-je faire un' git revert' à la place, qui ne réécrirait pas l'histoire et ne provoquerait donc pas une poussée de force. Relisez ma question pour comprendre pourquoi j'hésite à utiliser les deux approches. –

+0

'git reset' et' force push' réécriraient l'historique afin que les gens suggèrent de ne pas l'utiliser, mais si vous avez le contrôle (bitbucket le prévoit) alors il peut être utilisé dans de telles situations. Comme je vois qu'aucune des suggestions ne donne la réponse exacte que vous cherchez, alors je peux vous suggérer de créer un référentiel fictif avec des fichiers et des branches factices? Reproduisez la situation dessus et voyez quelle solution fonctionnerait pour vous. De cette façon, vous pouvez essayer plusieurs choses en toute sécurité sans déranger votre maître. – RuSh