2010-03-10 4 views
4

Remarque: Le scénario que je décris ici n'a pas trouvé de réponse dans Stack Overflow: Completely manual Mercurial merge.Mercurial: comment fusionner avec le contrôle manuel des modifications et des fichiers?

Je vais expliquer ma requête avec un exemple. On suppose Je commence un dépôt Mercurial pour concevoir une voiture:

C:\Car$ dir 
Car.cpp 
Car.h 

Je travaille sur la conception de voitures pour un certain temps et le dépôt ressemble à:

r0-r1-...-r100-(default) 

À un certain moment Je branche par défaut à SolarCarBranch travailler sur une voiture à énergie solaire en parallèle:

C:\SolarCar$ dir 
Car.cpp 
Car.h 
Solar.cpp 
Solar.h 

Après un peu plus de temps, le dépôt ressemble à:

r0-r1-...-r100-...-r200-(default) 
      \--r101-...-r201-(SolarCarBranch) 

Comment fusionner SolarCarBranch Retour à défaut?

Prenez note des complications suivantes dans la fusion que je veux:

  1. je devrais être en mesure de poursuivre les travaux sur les deux par défaut et SolarCarBranch après la fusion.
  2. Il pourrait y avoir des corrections d'efficacité énergétique dans Car.cpp et Car.h dans SolarCarBranch que je veux tiré dans défaut, mais je ne veux pas tous les changements dans ces fichiers. Donc, je tiens à choisir les changements que je veux être inclus dans par défaut lors de la fusion (alias fusion manuelle).
  3. Je ne pas veulent Solar.cpp et Solar.h apparaissant dans par défaut. Le monde n'est peut-être pas encore prêt pour une voiture à énergie solaire. ;-)

Ce que j'ai appris:

  1. Ceci est possible par un hg merge SolarCarBranch
  2. Ceci peut être réalisé par la mise en kdiff3.premerge=False dans Mercurial.ini
  3. Je ne sais pas comment y parvenir depuis premerge=False fusionne toujours/copie Solar.cpp et Solar.h en par défaut sans me demander la permission.

Répondre

5

Vous êtes vraiment proche et vous n'avez pas besoin de recourir à la transplantation (beurk) ou à la cueillette des cerises en général. Désactiver premerge est la première étape, puis supprimez simplement les fichiers que vous ne voulez pas dans la branche principale après la fusion mais avant de les valider. Vous n'aurez qu'à le faire une fois.

Voici une configuration:

o changeset: 3:343d531512a3 
| branch:  solar 
| tag:   tip 
| parent:  1:cb26642f8db5 
| user:  Ry4an Brase <[email protected]> 
| date:  Wed Mar 10 11:16:48 2010 -0600 
| files:  afile 
| description: 
| solar-change 
| 
| 
| @ changeset: 2:c5d14e34db07 
| | parent:  0:56465175b2fc 
| | user:  Ry4an Brase <[email protected]> 
| | date:  Wed Mar 10 11:05:44 2010 -0600 
| | files:  other-main-file 
| | description: 
| | moremain 
| | 
| | 
o | changeset: 1:cb26642f8db5 
|/ branch:  solar 
| user:  Ry4an Brase <[email protected]> 
| date:  Wed Mar 10 11:04:32 2010 -0600 
| files:  solar-only 
| description: 
| solar-initial 
| 
| 
o changeset: 0:56465175b2fc 
    user:  Ry4an Brase <[email protected]> 
    date:  Wed Mar 10 11:04:14 2010 -0600 
    files:  afile 
    description: 
    initial 

Vous pouvez voir que changeset 1 ajoute un fichier à la branche solaire - un fichier que nous ne voulons pas en défaut. Alors que changeset 3 ajuste un fichier qui existe aussi dans main, afile, et nous voulons contrôler manuellement si ce changement se produit ou non.

Tout comme hg update default ; hg merge -r solar. L'outil de fusion apparaîtra pour afile et nous déciderons ligne par ligne ou morceau par morceau si nous voulons ces changements. Après avoir enregistré une hg stat faire:

% hg stat 
M afile 
M solar-only 

Et nous voyons que l'énergie solaire est uniquement mis en attente pour commiting en défaut. Il suffit de l'enlever (avec if).

% hg rm -f solar-only 

Maintenant hg stat il montre que retiré:

% hg stat 
M afile 
R solar-only 

et quand nous nous engageons, nous aurons ce que nous voulons dans le nouveau changeset.

+0

Suppression de ces fichiers! Comment ai-je manqué ça! Merci beaucoup! :-) –

2

Votre première condition, pour être en mesure de poursuivre les travaux sur les deux branches, est satisfaite par tout simplement pas fermer la branche (que vous faites avec l'option --close-branch-hg commit).

Vous pouvez sélectionner les ensembles de modifications à fusionner à l'aide de Transplant extension.Cela vous permettra de choisir uniquement des changesets spécifiques à fusionner par défaut. La troisième condition est satisfaite par l'idée que si vous ne mélangez pas les changements à la fois à votre voiture ordinaire et à votre voiture solaire, vous pouvez retirer les changesets de la branche solaire en toute impunité, et non avoir à vous soucier de mélanger les types de votre voiture.

Vous pouvez également consulter les indicateurs d'option internal dans le merge configuration docs.

+0

ressemble à la cerise-cueillette est ce qui est nécessaire pour moi –

+1

vraiment? Je ne pense pas que la cueillette des cerises est nécessaire. Tant que la pré-fusion est désactivée, vous avez toujours le contrôle sur l'ajout de chaque modification, morceau par morceau ou ligne par ligne. La cueillette des cerises est juste une main courte pour ne pas avoir à rejeter manuellement les changements dans certains csets, mais vous pouvez toujours leur dire "non". Je déconseille vraiment l'extension Transplant parce que vous avez deux fois les mêmes changements dans votre repo avec deux hash-id différents. –

+1

@ Ry4an J'avais pensé à suggérer le commit manuel comme vous le décrivez, mais 'repiquer 'semblait être plus facile quand je l'écrivais. Mais votre explication m'a convaincu que c'est la meilleure option, en particulier votre point de vue d'avoir le même changeset avec deux hachages différents. J'ai donc voté pour votre réponse et je suggère que le PO soit accepté. – gavinb

Questions connexes