2010-10-02 5 views
32

Je travaille sur un projet où j'ai un commit qui a introduit une fonctionnalité avec des problèmes majeurs qui n'ont pas été découverts immédiatement. Maintenant, je veux complètement supprimer cette révision tout en gardant le travail qui suit, mais j'ai du mal à envelopper ma tête autour de cette fusion à 3 voies. Voici un graphique simplifié de mon projet.Comment les 3 voies fusionnent-elles dans Mercurial/Meld?

 
o changeset: 134:7f81764aa03a 
| tag:   tip 
| parent:  128:451d8a19edea 
| summary:  Backed out changeset 451d8a19edea 
| 
| @ changeset: 133:5eefa40e2a29 
| | summary:  (Change I need to keep keep) 
| | 
*snip 3 commits* 
| o changeset: 129:5f6182a97d40 
|/ summary:  (Change I need to keep keep) 
| 
o changeset: 128:451d8a19edea 
| summary:  (Change that introduced a major problem) 
| 
o changeset: 127:4f26dc55455d 
| summary:  (summary doesn't matter for this question) 

Si je comprends bien, r127 et r134 sont exactement les mêmes. Lorsque je hg up -C -r 133, puis exécutez hg merge, Meld apparaît avec trois formes de l'un de mes fichiers: local, base et autre. local semble être r133 mais j'ai du mal à comprendre ce que "base" et "autre" veulent dire.

Répondre

34

Local est R133

Autre est R134

base est r128 (l'ancêtre commun aux deux R133 et R134)

Lorsque vous effectuez une 3 façon fusionner compare tous les trois pour vous aider à décider quoi prendre et d'où. En voyant quel changement est dans l'autre révision et à quoi ressemble l'ancêtre commun, vous êtes en mesure de prendre une décision beaucoup plus éclairée sur ce qu'il faut garder et quoi changer.

+0

Donc, vous dites que beaucoup de choses vont fusionner manuellement? – Pacerier

10

Votre question est vraiment confuse, mais voici quelques informations qui peuvent vous aider.

  • Qu'est-ce qu'une base?

Base est la version non modifiée de la révision sur laquelle vous avez actuellement extrait et travaillé. où éventuellement d'autres changements ont été générés (vous pouvez avoir des révisions entre votre local actuel et votre base!). C'est juste là où la révision la plus proche où aucune autre fourchette n'a été dérivée depuis (même parent) (dans votre cas r128)

  • Qu'est-ce que la tête?

Head est la dernière révision du contrôle de version. Si vous travaillez seul sur un seul exemplaire, il sera probablement base. mais un collaborateur a peut-être modifié le même fichier et l'a vérifié dans le contrôle de version, puis la tête est plus tard que votre base.

  • Qu'est-ce que c'est local?

locale est votre version modifiée (dans votre cas R133)

  • Qu'est-ce que d'autres?

Autre est la fourchette une/branche qui a également votre base en tant que parent (dans votre cas R134)

  • Comment fonctionne la fusion 3 voies?

La fusion à 3 directions fonctionne (au moins dans la fusion) de manière hiérarchique.généralement de gauche à droite comme ceci:

locale> Base> autre/tête

local/base est essentiellement trivial parce que sa juste ce que vous avez modifié

alors vous pouvez fusionner vos modifications dans la révision de la tête ou celui de votre collègue ou quoi que ce soit.

Il peut y avoir plusieurs autres révisions d'en-tête, mais ce n'est pas à vous de fusionner et donc une comparaison à plus de 3 voies n'a pas de sens.

+12

Votre définition de la tête n'est pas précise pour mercurial. La dernière révision de mercurial s'appelle "tip". Un pourboire est toujours une tête mais une tête n'est pas toujours un pourboire. Dans une fusion, 'head' n'est jamais 'base' car la base est l'ancêtre commun le plus récent des deux changesets fusionnés. –