Récemment, plusieurs questions ont été posées sur l'omission des modifications lors de la maintenance des branches de version dans Mercurial. Par exemple:
- Mercurial: les changements spécifiques aux branches reviennent après la fusion factice
- Pourquoi les backouts Mercurial dans une branche affectent-ils les autres branches?
Depuis son introduction en 2.0, je me suis demandé comment l'utiliser graft
pour éviter ce problème. Étant donné un arbre de révision comme celui-ci:
A---B---C---D---E---F---G---H---I---J
Supposons que nous ayons besoin de créer une branche de publication qui ignore le changement Evil E
.
hg update -r D
hg graft "F::J"
Nous donnant:
A---B---C---D---E---F---G---H---I---J
\
--F'--G'--H'--I'--J'
- Q1: Que vient de se passer ici? Je peux comprendre que
transplant
cela aurait généré des correctifs à partir deF::J
, puis les aurait appliquésD
, maisgraft
on dit qu'il utilise la fusion à 3 voies plutôt que des correctifs. Alors ... comment ça marche? Pourquoi est-ce mieux?
Disons que je corrige maintenant E
et fusionne cela dans ma branche de publication.
--E2-----------------
/ \
A---B---C---D---E---F---G---H---I---J---M1
\ \
--F'--G'--H'--I'--J'---------M2--
M1 est une fusion directe; rien de spécial là-bas. M2 fusionne des branches qui ont "les mêmes" changements (ou au moins équivalents).
- Q2: Cette fusion est-elle simplement une fusion à trois voies normale utilisant
D
,J'
etM1
? - Q3: Mercurial a-t-il stocké / utilisé des informations supplémentaires sur l'opération de greffe pour l'aider dans la fusion?
Et enfin...
- Q4: Quels sont les problèmes potentiels avec un flux comme celui-ci?
Q1: Cela aide quand il y a des conflits. Vous pouvez alors utiliser votre outil de fusion habituel (pour moi, ce sont des marqueurs de conflit en ligne, que j'édite avec le mode smerge d'Emacs).
Q2: C'est une fusion normale.
Q3: Non.
Q4: Je pense que c'est moche d'avoir deux branches presque identiques.
la source