Ré-fusionner une fusion dans Git

J’ai rencontré un problème ici: j’avais une twig 28s spécifique à Git, que j’ai fusionnée dans la twig develop général. Il s’est avéré que je l’avais fait trop vite, alors j’ai utilisé git-revert pour annuler la fusion. Maintenant, cependant, le temps est venu de fusionner les 28s en develop , mais la commande git-merge voit la fusion originale et annonce heureusement que tout va bien et que les twigs ont déjà été fusionnées. Qu’est-ce que je fais maintenant? Créer un “Revert” Revert “28s -> develop” “” commit? Cela ne semble pas être un bon moyen de le faire, mais je ne peux pas en imaginer d’autres pour le moment.

À quoi ressemble l’arborescence:

Sortie de journal Git

Vous devez “annuler le retour”. Cela dépend de la manière dont vous avez inversé cela, cela peut ne pas être aussi simple que cela en a l’air. Regardez le document officiel sur ce sujet .

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

autoriser:

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

Mais tout fonctionne-t-il? Bien sûr que oui. Vous pouvez inverser une fusion, et d’un sharepoint vue purement technique, Git l’a fait très naturellement et n’a pas eu de problèmes réels.
Il a simplement considéré que le passage de “état avant la fusion” à “état après fusion”, et c’était tout.
Rien de compliqué, rien d’étrange, rien de vraiment dangereux. Git le fera sans même y penser.

Donc, d’un sharepoint vue technique, il n’y a rien de mal à renverser une fusion, mais d’un sharepoint vue du stream de travail, c’est quelque chose que vous devriez généralement éviter .

Si possible, par exemple, si vous trouvez un problème qui a été fusionné dans l’arbre principal, plutôt que de revenir à la fusion, essayez vraiment de :

  • coupez le problème en deux dans la twig que vous avez fusionnée et corrigez-la,
  • ou essayez de revenir sur l’engagement individuel qui l’a causé.

Oui, c’est plus complexe, et non, ça ne va pas toujours fonctionner (parfois la réponse est: “oups, je n’aurais vraiment pas dû le fusionner, parce que ce n’était pas encore prêt, et j’ai vraiment besoin de défaire toutes les fusionner”). Donc, vous devriez vraiment annuler la fusion, mais quand vous voulez refaire la fusion, vous devez maintenant le faire en rétablissant le retour.

Supposons que vous ayez une telle histoire

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

Où A, B a échoué aux commits et W – est la reprise de M

Donc, avant que je commence à réparer les problèmes trouvés, je fais un choix judicieux de W, je m’engage dans ma twig

 git cherry-pick -x W 

Puis je reviens sur W engage sur ma twig

 git revert W 

Après je peux continuer à réparer.

L’histoire finale pourrait ressembler à:

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

Lorsque j’envoie un PR, cela montre clairement que le PR est annulé et ajoute de nouveaux commits.

Pour annuler le retour sans visser trop votre workflow:

  • Créer une copie de corbeille locale de develop
  • Rétablit le commit de retour sur la copie locale de develop
  • Fusionnez cette copie dans votre twig de fonctions et transférez votre twig de fonctionnalités vers votre serveur git.

Votre twig de fonctions devrait maintenant pouvoir être fusionnée normalement lorsque vous y êtes prêt. Le seul inconvénient ici est que vous aurez un peu plus de fusions / resockets de commits dans votre histoire.

Au lieu d’utiliser git-revert vous auriez pu utiliser cette commande dans la twig devel pour supprimer (annuler) la mauvaise validation de fusion (au lieu de simplement la rétablir).

 git checkout devel git reset --hard COMMIT_BEFORE_WRONG_MERGE 

Cela ajustera également le contenu du répertoire de travail en conséquence. Faites attention :

  • Enregistrez vos modifications dans la twig de développement (car la fusion incorrecte) car elles seront également effacées par la git-reset . Tous les commits après celui que vous spécifiez comme argument de git reset auront disparu!
  • De plus, ne le faites pas si vos modifications ont déjà été extraites d’autres référentiels, car la réinitialisation réécrira l’historique.

Je recommande d’étudier attentivement la page de manuel git-reset avant d’essayer cela.

Maintenant, après la réinitialisation, vous pouvez ré-appliquer vos modifications dans devel et ensuite faire

 git checkout devel git merge 28s 

Ce sera une véritable fusion de 28s en devel comme celui initial (qui est maintenant effacé de l’histoire de git).

Je viens de trouver ce post face au même problème. Je trouve ci-dessus que toyyy est effrayant de réinitialiser les hards etc. Je vais finir 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 twig revienne, par exemple, à la git checkout 123466t7632723 . Puis converti en une twig git checkout my-new-branch . J’ai ensuite supprimé la twig que je ne voulais plus. Bien sûr, cela ne fonctionnera que si vous êtes capable de jeter la twig que vous avez ratée.

Pour annuler un retour:

 git revert