2011-02-09 5 views
16

Prenons un exemple simple: je travaille sur la branche par défaut, j'ai des changesets validés localement, et j'en ai extrait quelques autres du dépôt principal. Je travaille depuis quelques jours dans mon référentiel local isolé, il y a donc pas mal de changements à fusionner avant de pouvoir ramener mes résultats en master.Est-ce que fusionner la direction importe dans Mercurial?

default ---o-o-o-o-o-o-o-o-o-o-o (pulled stuff) 
      \ 
      o----o------------o (my stuff) 

Je peux faire deux choses maintenant.

Option 1:

hg pull 
hg merge 

Résultat # 1:

default ---o-o-o-o-o-o-o-o-o-o-o 
      \     \ 
      o----o------------o-O 

Option # 2:

hg pull 
hg update 
hg merge 

Résultat # 2:

default ---o-o-o-o-o-o-o-o-o-o-o-O 
      \     /
      o----o------------o 

Ces deux résultats me semblent isomorphes, mais en pratique, il semble que l'option n ° 2 entraîne de plus petits changements (car il applique seulement mes quelques changements à la ligne principale au lieu d'appliquer tous les changements à ma ligne principale).

Ma question est: est-ce important? Devrais-je m'occuper de la direction de mes fusions? Suis-je économiser de l'espace si je fais cela? (Faire hg log --patch --rev tip après la fusion le suggère.)

Répondre

14

Ils sont (effectivement) identiques. Vous voyez une différence dans la taille de sortie hg log --patch --rev X car le journal affiche le diff du résultat et (arbitrairement) son parent 'gauche' (officiellement p1), mais ce n'est pas la façon dont il est stocké (Mercurial a un format de stockage binaire diff qui n'est pas corrigé/diff based) et c'est maintenant comment il est calculé (p1, p2, et most-common-common-ancestor sont tous utilisés). La seule vraie différence est que si vous utilisez des branches nommées, le nom de la branche sera celui du parent gauche.

2

Il existe également une différence si vous utilisez des signets. Lorsque vous effectuez une fusion, la branche que vous êtes est la branche qui reçoit les modifications, de sorte que le nouveau changeset fera partie de cette branche. Supose vous avez cette situation:

default ---o-o-o-o-o-o-o-o-o-o-o -- Head: Rev 200 
      \ 
      o----o------------o -- Head: Rev 195, Bookmark: my-stuff 

Si vous fusionnez Rev 200 dans Rev 195, le signet my-stuff se déplacera à Rev 201, comme vous générez un nouveau changeset dans la même branche qui a le signet. D'autre part, si vous fusionnez 195 en 200, vous générez un ensemble de modifications dans la branche qui n'a pas le signet. Le signet my-stuff restera dans Rev 195.

+1

Ceci est particulièrement important si vous utilisez [Hg-Git] (http://hg-git.github.com/), car il suit la position des branches Git virtuelles. en utilisant des signets. Si vous fusionnez dans le mauvais sens, le signet de la branche Git ne bougera pas et vous n'aurez rien à pousser. –

+0

La fusion de 200 en 195 n'est pas garantie pour déplacer le signet vers 201. Si vous mettez 'hg update my-stuff; hg merge 200' il le fera, mais si vous faites 'hg update 195; hg merge 200' ce ne sera pas. La mise à jour par nom de signet le rend * actif *. –

Questions connexes