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:

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 de F::J , et ensuite appliqué sur D , mais graft 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' et M1 ?
  • 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?
98
demandé sur Community 2012-03-07 13:24:09

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.

119
répondu Martin Geisler 2014-12-04 14:26:07

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.

6
répondu Ringding 2012-03-07 10:49:57