Conséquences de l'utilisation de la greffe dans le Mercurial
il y a eu plusieurs questions récemment sur le fait de sauter des changements lors du maintien des branches de libération dans Mercurial. Par exemple:
- Mercurial: les changements spécifiques aux branches continuent de revenir après la fusion factice
- Pourquoi Mercurial backouts dans une branche qui touchent d'autres branches?
depuis son introduction en 2.0, je me suis demandé utiliser graft
pour éviter ce problème. Avec un arbre de révision comme ceci:
A---B---C---D---E---F---G---H---I---J
supposons que nous ayons besoin de créer une branche de libération qui saute le changement maléfique 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-il de se passer ici? Je peux comprendre que
transplant
aurait généré des patches à partir deF::J
, et ensuite appliqué surD
, maisgraft
est dit d'utiliser la fusion à 3 voies plutôt que des patches. Si....... comment cela fonctionne? Pourquoi est-il 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 un droit de fusion; rien de spécial. M2 est la fusion de branches qui ont" les mêmes " changements (ou au moins équivalents) sur.
- Q2: Est-ce que cette fusion est juste une fusion normale à 3 voies en utilisant
D
,J'
etM1
? - Q3: mercurial a-t-il stocké/utilisé des informations supplémentaires sur l'opération de la greffe pour l'aider dans la fusion?
et enfin...
- Q4: Quels sont les problèmes potentiels avec un tel flux?
2 réponses
lorsque vous passez à D
et à la greffe F::J
, Mercurial exécute un certain nombre de fusions. Il commencera par cette fusion:
M = three_way_merge(local=D, other=F, base=E)
si nous écrivons +d
pour le delta entre les États C
et D
, alors nous commençons par:
+d +e +f
---- C ---- D ---- E ---- F ----
tournez le graphe de 90 degrés dans le sens des aiguilles d'une montre et la fusion à trois ci-dessus ressemble à ceci:
-e
.---- D
/
E
\
'---- F
+f
C'est-à-dire, nous prétendons que nous commencé par E
et appliqué le contraire de -e
pour obtenir à D
. Je pense que c'est le patch inverse de +e
. À partir de E
nous sommes également allés à l'état F
avec le delta normal +f
. Il n'y a rien d'étrange ici - nous avons déjà tous les États ( D
, E
, et F
) dans le dépôt. Donc vu comme ça, il est clair que nous pouvons fusionner D
et F
.
La fusion est une question de compléter "le diamant". Si nous trouvons un nouvel état M
qui est un mélange de D
et F
et où la différence de D
à M
est similaire à +f
et la différence de F
à M
est similaire à -e
. Il ressemble à ceci:
-e +f'
.---- D ----.
/ \
E M
\ /
'---- F ----'
+f -e'
le "delta 1519170920" est devenu +f'
et le" delta 1519120920 "est devenu -e'
. C'est juste un Fusion normale à trois, mais l'effet est intéressant: nous avons appliqué F
sur D
au lieu de E
!
après la fusion, le deuxième parent de M
à F
est supprimé:
-e +f'
.---- D ----.
/ \
E M
\
'---- F
+f
pour réitérer: nous avons copié "l'effet" de F
sur D
, c'est-à-dire que nous avons trouvé un delta ( +f'
) qui s'appliquait à D
donner le même effet que lorsque +f
était appliqué à E
. Nous pouvons redresser un peu le graphique pour obtenir:
+f'
--- D ---- M
\
'---- E ---- F
+e +f
le résultat est que F
est greffé sur D
à l'aide de la machinerie complète à trois voies.
-
Q1: que vient-il de se passer ici? Si....... comment cela fonctionne? Pourquoi est-il mieux?
A1: L'utilisation de merges est préférable que les correctifs depuis la machine de fusion prend des choses comme les renommages en compte.
-
Q2: est-ce que cette fusion est juste une fusion normale à 3 voies utilisant D, J' et M1?
A2: Oui, la greffe ne modifie pas la topologie du graphique.
-
Q3: est-ce que mercurial a stocké/utilisé des informations supplémentaires sur l'opération de la greffe pour l'aider avec la fusion?
A3: No.
-
Q4: Quels sont les problèmes potentiels avec un tel flux?
A4: du point de vue de la fusion, ça devrait marcher. Il dupliquera une histoire qui pourrait être déroutante pour les gens.
Q1: cela aide quand il y a des conflits. Vous pouvez alors utiliser votre outil de fusion habituel (pour moi, c'est des marqueurs de conflit en ligne, que j'édite avec le mode smerge D'Emacs).
Q2: c'est une fusion normale.
T3: Non.
Q4: je pense que c'est moche d'avoir deux branches presque identiques.