77 votes

Retour en arrière d'une fusion en arrière sur Mercurial

Comment inverser l'effet d'une fusion sur des branches polarisées sans mourir d'agonie ?

Ce problème me tourmente depuis mois et j'ai finalement abandonné.

Vous avez 1 référentiel, avec 2 Nommé Branches. A et B.

Les changements qui surviennent en A se répercutent inévitablement en B.

Les changements qui se produisent directement sur B NE DOIVENT JAMAIS se produire sur A.

Dans une telle configuration, la fusion de "B" en "A" produit un gros problème dans le référentiel, car toutes les modifications de B apparaissent dans A comme si elles avaient été faites dans A.

La seule façon "normale" de se remettre de cette situation semble être de "revenir en arrière" dans la fusion, c'est-à-dire d'annuler la fusion :

 hg up -r A 
 hg backout -r BadMergeRev --parent BadMergerevBeforeOnA 

Ce qui semble très bien, jusqu'à ce que vous décidiez de fusionner plus tard dans la bonne direction, et vous vous retrouvez avec toutes sortes de choses désagréables qui se produisent et le code qui a été effacé / commenté sur la branche spécifique B devient soudainement non effacé ou non commenté.

Jusqu'à présent, il n'y a pas eu de solution viable à ce problème, à part "laisser faire les choses, puis régler tous les problèmes à la main", ce qui, pour être honnête, est un peu foireux.

Voici une image qui clarifie le problème :

[Image originale perdue]

Les fichiers C et E (ou les modifications C et E) doivent apparaître uniquement sur la branche b, et non sur la branche a. La révision A9 ici ( branche a, revno 9 ) est le début du problème.

Les révisions A10 et A11 sont les phases de "fusion du backout" et de "fusion du backout".

Et la révision B12 est mercuriale, abandonnant par erreur et à plusieurs reprises un changement qui ne devait pas être abandonné.

Ce dilemme a causé beaucoup de frustration et de fumée bleue et je voudrais y mettre un terme.

Note

La réponse la plus évidente est peut-être d'essayer d'empêcher la fusion inverse de se produire, soit avec des crochets, soit avec des politiques, mais j'ai constaté que la capacité de faire échouer cette opération est plutôt élevée et que le risque qu'elle se produise est si probable que, même avec des contre-mesures, on ne peut pas faire autrement. doit suppose toujours qu'inévitablement, il sera pour que vous puissiez le résoudre quand il se produira.

Elaborer

Dans le modèle, j'ai utilisé des fichiers séparés. Ceux-ci font paraître le problème simple. Ils représentent simplement changements arbitraires qui pourrait être une ligne séparée.

De plus, pour ajouter l'insulte à l'injure, des modifications substantielles ont été apportées à la branche A, ce qui pose le problème suivant : "les modifications de la branche A entrent-elles en conflit avec les modifications de la branche B qui viennent d'apparaître (et qui ont été retirées) et qui ressemblent à une modification de la branche A ?

Sur les astuces de réécriture de l'histoire :

Le problème de toutes ces solutions rétroactives est le suivant :

  1. Nous avons 9000 commits.
  2. Le clonage à l'état frais prend donc une demi-heure
  3. S'il existe même un mauvais clone du référentiel quelque part il est probable qu'il revienne en contact avec le dépôt d'origine, et le perturbe à nouveau.
  4. Tout le monde a déjà cloné ce dépôt, et maintenant plusieurs jours ont passé avec des commits continus.
  5. L'un de ces clones se trouve être un site actif, donc "effacer ce site et repartir de zéro" = "grand nono".

(J'admets que la plupart des propositions ci-dessus sont un peu stupides, mais elles sont hors de mon contrôle).

Les seules solutions qui sont viables sont celles qui supposent que les gens peut et sera font tout de travers, et qu'il existe un moyen de "défaire" ces erreurs.

1voto

Kent Fredric Points 35592

Après de nombreuses discussions avec certaines des personnes utiles sur #mercurial sur freenode, mpm a fourni une partiel solution qui semble fonctionner pour mon cas d'essai ( j'ai généré un faux référentiel pour essayer de reproduire le scénario )

Cependant, sur mon référentiel actuel, pour des raisons que je ne comprends pas bien, il est encore loin d'être parfait.

Voici un schéma de la manière actuellement proposée pour résoudre ce problème :

[Image originale perdue]

C'est maintenant. moins C'est un problème à résoudre, mais je dois toujours comparer les différences (par exemple, b46:b11 vs b46:b8, a43:a10 vs a43:a9) et rééditer manuellement certaines modifications.

Je ne fermerai pas cette question/réponse tant que je n'aurai pas trouvé un moyen garanti qui fonctionne sur n'importe quel référentiel.

Important

Toute personne essayant ce genre de choses devrait cloner son dépôt et jouer avec comme un bac à sable d'abord. Comme vous devriez le faire avec tout processus de fusion, parce que de cette façon, si ça se passe mal, vous pouvez simplement le jeter et recommencer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X