3
votes

J'ai besoin d'annuler temporairement une fusion pour pouvoir y revenir plus tard

J'ai fusionné une branche latérale (fonctionnalité / b) dans develop, J'ai eu des conflits de fusion et j'ai pris une mauvaise décision sur la façon de les résoudre. J'ai ensuite fait un commit manuel pour résoudre d'autres problèmes. Plus de commits sont arrivés à feature / b et j'ai ensuite fusionné ceux-ci aussi J'ai alors réalisé mon erreur et j'ai annulé la dernière fusion.

Tout a été poussé vers la télécommande et a été tiré par l'équipe.

Les choses sont maintenant désordonnées. Je dois redevenir stable, mais aussi être en mesure de résoudre les conflits de la fusion d'origine.

Quelle est ma meilleure option pour résoudre ce problème?

  • revenir sur les trois étapes? Si je comprends bien les choses, ce n'est pas le cas me donner la deuxième chance de résoudre les conflits d'origine?
  • réinitialiser la tête? détruisant efficacement l'histoire? cela affecte-t-il l'historique des autres branches?
  • abandonner et créer par exemple develop2 branche avant de partir faux?

Merci,

J'ai lu cette réponse étroitement liée, mais je recherche plus de conseils: Comment annuler un commit de fusion qui est déjà poussé vers une branche distante?


0 commentaires

3 Réponses :


4
votes

Cela ressemble en effet à une situation désordonnée.

Mon approche serait votre dernière suggestion: abandonner et créer une nouvelle branche de développement avant que les choses ne se passent mal. Sur cette branche, vous pouvez refaire la fusion qui n'a pas été effectuée correctement, puis sélectionner toutes les bonnes validations qui ont été effectuées après la fusion incorrecte. Poussez cela et demandez à l'équipe de travailler sur la nouvelle branche de développement.

Cette solution a l’avantage que si quelqu'un n’a pas poussé les commits sur la mauvaise branche de développement, il peut également les sélectionner en privé sur la bonne.


0 commentaires

0
votes

Cette réponse suppose que votre branche feature / b actuelle ressemble à ceci:

git revert -m 1 HEAD~3^..HEAD

Ici M est le commit de fusion que vous ne voulait pas, puis commits A à C est venu d'autres développeurs, qui avaient tiré la branche, puis poussé. Nous pouvons essayer d'utiliser git revert avec une plage:

feature/b:  .. M -- A -- B -- C

La syntaxe HEAD ~ 3 ^ .. HEAD signifie Revert commits de et y compris trois avant le commit HEAD jusqu'à un commit incluant le HEAD . L'option -m 1 indique à Git de suivre le premier parent de la branche, qui serait généralement la branche sur la télécommande (la source de la branche de la fusion serait -m 2 code >).

Notez qu'il est nécessaire de git revert ici car vous avez déjà publié cette branche. Des choses comme la réinitialisation matérielle et d'autres choix modifiant l'historique ne seraient pas idéales ici.


0 commentaires

1
votes

Quoi que vous fassiez, ne réinitialisez pas et ne poussez pas le développement forcé car il est partagé avec d'autres développeurs et il deviendra plus compliqué.

Vous pouvez revenir en arrière, mais comme vous l'avez vu, sachez que les commits précédemment fusionnés seront ignorés lors de la fusion future (car l'historique n'a pas changé). Je recréerais la branche de fonctionnalité comme s'il s'agissait d'une nouvelle.

Vous pouvez facilement le faire avec un rebase en spécifiant à partir de quel commit démarrer le rebase, ce qui est expliqué dans le lien que vous avez fourni.

Disons que nous sommes dans cette situation

 /B-C\
A-----D-E-F(develop)
 \B'-C'(feature/1)

où A est develop avant la fusion et l'origine de la branche , C est la branche feature / 1 au moment de la fusion, D le commit de fusion, E la tentative de le réparer.

Commencez par revenir à D et E, car D est un merge commit, vous devrez spécifier à quel parent revenir en utilisant -m , il devrait être 1 mais vérifiez ( git revert D -m 1 ). Puis rebasez la branche feature / 1 sur la validation A (origine de la branche)

git checkout feature/1
git rebase --no-ff A (no-ff to force rebase)

Ensuite, vous terminerez comme ceci:

 /B-C\(feature/1)
A-----D-E(develop)

où F est le commit pour les retours et B 'et C' nouvellement créés commits.

Et vous pouvez fusionner feature / 1 comme s'il s'agissait d'une nouvelle branche.


0 commentaires