Refaire une fusion inversée dans Git

j'ai rencontré un petit problème ici: j'avais une branche 28s en Git, que j'ai fusionnée dans la branche générale develop . Il s'avère que je l'avais fait trop vite, donc j'ai utilisé git-revert pour annuler la fusion. Maintenant, cependant , le moment est venu de fusionner 28s en develop , mais la commande git-merge voit la fusion originale, et annonce heureusement que tout va bien et que les branches ont déjà été fusionnées. Que dois-je faire maintenant? Créer un 'Revert' 28s - > develop""' s'engager? Ne semble pas être une bonne façon de le faire, mais je ne peux pas imaginer un autre pour le moment.

à quoi ressemble la structure de l'arbre:

Git log output

165
demandé sur Scott Weldon 2009-07-03 11:15:28

6 réponses

vous devez"revenir en arrière". Dépend comment avez-vous revenir, il peut ne pas être aussi facile qu'il y paraît. Regardez le document officiel sur ce sujet .

---o---o---o---M---x---x---W---x---Y
              /
      ---A---B-------------------C---D

pour permettre:

---o---o---o---M---x---x-------x-------*
              /                       /
      ---A---B-------------------C---D

mais est-ce que tout fonctionne? Bien sûr, il ne. Vous pouvez revenir à une fusion, et à partir d'un d'un point de vue purement technique, git l'a fait très naturellement et n'avait pas de réel difficulté.

Il vient de considéré comme un changement de "état avant la fusion" à "l'état après la fusion", et qu'il a été.

Rien de compliqué, rien de bizarre, rien de vraiment dangereux. Git le fera sans même y penser.

donc d'un point de vue technique, il n'y a rien de mal à revenir sur une fusion, mais d'un point de vue de flux de travail, c'est quelque chose que vous devriez généralement essayer de éviter les .

si possible, par exemple, si vous trouvez un problème qui les a fusionnés dans l'arbre principal, plutôt que de revenir à la fusion, essayer vraiment difficile à :

  • divisez le problème en deux dans la branche que vous avez fusionnée, et réparez-le,
  • ou essayer d'inverser la propagation individuelle qui l'a causé.

Oui, c'est plus complexe, et non, ça ne va pas toujours marcher (parfois la réponse est: "Oups, je n'aurais vraiment pas dû la fusionner, parce qu'elle n'était pas prêt encore, et je dois vraiment annuler tous de la fusion"). Alors vous vraiment devrait revenir à la fusion, mais quand vous voulez re-faire la fusion, vous maintenant, il faut le faire en inversant le retour.

131
répondu J-16 SDiZ 2009-07-03 10:59:15

supposons que vous ayez une telle histoire

---o---o---o---M---W---x-------x-------*
              /                      
      ---A---B

où A, B failed commits et W-is revert de M

donc, avant de commencer à réparer les problèmes trouvés, je fais un choix de W s'engager dans ma branche

git cherry-pick -x W

Puis-je revenir W s'engager sur ma branche

git revert W 

après que je puisse continuer à fixer.

La finale de l'histoire pourrait ressembler à:

---o---o---o---M---W---x-------x-------*
              /                       /     
      ---A---B---W---W`----------C---D

quand j'envoie un PR, cela montrera clairement que PR n'est pas revert et ajoute de nouvelles propagations.

36
répondu Maksim Kotlyar 2013-03-26 20:21:19

pour revenir en arrière sans trop gâcher votre flux de travail:

  • Créer un local poubelle copie de développer
  • Revenir revenir s'engager sur la copie locale de se développer
  • Fusionner copier dans votre branche, et poussez votre branche à votre serveur git.

votre branche de fonctionnalité devrait maintenant pouvoir être fusionnée en tant que normale lorsque vous êtes prêt. Le seul inconvénient voici que vous aurez un peu plus de merge/revert commits dans votre histoire.

4
répondu Sam Dufel 2017-05-22 18:32:28

au Lieu d'utiliser git-revert vous auriez pu utiliser cette commande dans le devel branche jeter (annuler) le mauvais commit de fusion (au lieu de simplement revenir).

git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE

ceci ajustera également le contenu du répertoire de travail en conséquence. Être prudent :

  • Enregistrez vos modifications dans la branche de développement (depuis la mauvaise fusionner) parce qu'ils trop sera effacé par le git-reset . Toutes les propagations après celle que vous spécifiez comme l'argument git reset aura disparu!
  • de plus, ne faites pas cela si vos modifications ont déjà été extraites d'autres dépôts. parce que la réinitialisation va réécrire l'histoire.

je recommande d'étudier attentivement la page de manuel git-reset avant d'essayer ceci.

maintenant, après la réinitialisation, vous pouvez appliquer vos modifications devel et puis faire

git checkout devel
git merge 28s

Ce sera une véritable fusion de 28s en devel comme le premier (qui est maintenant effacé de l'histoire de git).

2
répondu knweiss 2009-07-05 14:35:47

je viens de trouver ce post en faisant face au même problème. Je trouve au-dessus de wayyy effrayant de faire reset hards etc. Je finirai par supprimer quelque chose que je ne veux pas, et je ne pourrai pas le récupérer.

au lieu de cela, j'ai vérifié le commit que je voulais que la branche remonte à par exemple git checkout 123466t7632723 . Puis converti en une branche git checkout my-new-branch . J'ai ensuite supprimé la branche que je ne voulais plus. Bien sûr, cela ne fonctionnera que si vous êtes en mesure de jeter la branche que vous foiré.

1
répondu Claire 2017-11-13 10:34:16

pour revenir en arrière:

git revert <commit-hash-of-previous-revert>
0
répondu Richard 2018-08-09 21:06:47