web-dev-qa-db-fra.com

Conséquences de l'utilisation de la greffe dans Mercurial

Récemment, plusieurs questions ont été posées sur le fait d'ignorer les modifications lors de la maintenance des branches de version dans Mercurial. Par exemple:

Depuis qu'il a été introduit dans 2.0, je me suis posé la question d'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 devons 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-il de se passer ici? Je peux comprendre que transplant aurait généré des correctifs à partir de F::J, puis les a appliquées à D, mais graft est censé utiliser la fusion à trois plutôt que les 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 des changements "identiques" (ou au moins équivalents).

  • Q2: cette fusion est-elle une fusion à trois voies normale utilisant D, J' et M1?
  • 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?
98
Paul S

Lorsque vous mettez à jour vers D et greffez F::J, Mercurial exécute un certain nombre de fusions. Cela 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 on commence par:

        +d     +e     +f
---- C ---- D ---- E ---- F ----

Tournez le graphique 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

Autrement dit, nous prétendons que nous avons commencé avec E et appliqué le contraire de -e pour accéder à D. Je pense que le patch inverse de +e. À partir de E, nous sommes également passé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 référentiel. Ainsi vu comme ça, il est clair que nous pouvons fusionner D et F.

La fusion consiste à "achever le diamant". Nous trouvons donc un nouvel état M qui est un mélange de D et F et où la différence entre D et M est similaire à +f et la différence entre F et M est similaire à -e. Cela ressemble à ceci:

    -e     +f'
  .---- D ----.
 /             \
E               M
 \             /
  '---- F ----'
    +f     -e'

Le +f delta est devenu +f' et le -e delta est devenu -e'. C'est juste une fusion à trois voies normale, 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 vers 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 donne le même effet que lorsque +f a été appliqué à E. On peut 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 à trois voies complète.

  • Q1: Que vient-il de se passer ici? Alors ....... comment ça marche? Pourquoi est-ce mieux?

    A1: Utiliser les fusions est meilleur que les correctifs car le mécanisme de fusion prend en compte des choses comme les renommages.

  • Q2: Cette fusion est-elle juste une fusion à 3 voies normale utilisant D, J 'et M1?

    A2: Oui, la greffe ne modifie pas la topologie du graphique.

  • Q3: Mercurial a-t-il stocké/utilisé des informations supplémentaires sur l'opération de greffe pour l'aider dans la fusion?

    A3: Non.

  • Q4: Quels sont les problèmes potentiels avec un flux comme celui-ci?

    A4: Du point de vue de la fusion, cela devrait fonctionner correctement. Cela dupliquera une histoire qui pourrait prêter à confusion pour les gens.

119
Martin Geisler

Q1: Cela aide en cas de conflit. Vous pouvez ensuite 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.

6
Ringding