2012-06-04 4 views
2

Avec Mercurial, je vois souvent un scénario où je dois commettre une poussée progressive, mais si une autre personne s'engage au milieu de cela, alors je me retrouve dans un problème.Mercurial commettre et fusionner

Exemple: Supposons que le repo HG a quatre fichiers a.txt, b.txt, c.txt, d.txt et nous avons deux utilisateurs Mickey et Dingo:

Mickey does: $ echo "change1" >> a.txt 
Mickey does: $ echo "change2" >> b.txt 
Mickey does: $ echo "change3" >> c.txt 
Mickey does: $ hg commit -m "I am good" a.txt 
Goofy does: $ hg pull -u; echo "change4" >> d.txt; hg commit -m "The Donald change" 

Mickey se prépare à engager et push, mais a doit fusionner: Mickey fait: $ hg pull -u

Maintenant Mickey a deux changements - en b.txt et c.txt. Supposons que ses modifications dans c.txt sont complexes et ne peuvent pas être publiées maintenant. Comment Mickey peut-il obtenir ses changements dans a.txt et b.txt commis et poussé sans encore valider c.txt?

Répondre

2

simplement publier les noms de fichiers qui vous intéressent à commettre:

hg commit a.txt b.txt -m'partial commit' 

pousser ensuite comme d'habitude.

EDIT: IVous pourrait essayer d'enregistrer les changements locaux en tant que patch, revenir et extraire les modifications à distance, puis appliquez le patch:

hg diff > local.patch 
hg revert 
hg pull -u 
patch -p1 < local.patch 
+0

Pas ok - Mickey doit fusionner avant de pouvoir commettre, et là le problème est que c.txt ne peut pas encore être commis .... –

+0

Mon mauvais, je n'ai pas assez lu la question ... Alors qu'en est-il mettre les changements dans une branche séparée (ou même cloner le repo)? – piwi

+0

Je pense que vous avez besoin d'un "hg revenir." après le premier hg diff –

1

Votre question est pas tout à fait clair pour moi, s'il vous plaît me corriger si je vous vous êtes trompé.

Ce que Mickey a dans sa mise en pension est ce (A - changeset Mickey avec a changé, D - le changeset Goofy avec d changé, w - la copie de travail de Mickey avec b et c changé):

-- o --- A --- w 
    \ 
    D 

Maintenant Mickey a beaucoup d'options. b est prêt à être libéré, alors il engage immédiatement:

$ hg ci b.txt -m "Finished working on b.txt" 

-- o --- A --- B --- w 
    \ 
    D 

Maintenant que c changements sont laissés dans la copie de travail. Mickey fait un commit intermédiaire:

$ hg ci -m "working on c" 

-- o --- A --- B --- C' --- w 
    \ 
    D 

La copie de travail est propre. Pour vous assurer que C' ne figure pas dans la fusion, les mises à jour de Mickey au changeset précédent, puis se fond:

$ hg up B 
$ hg merge D 
$ hg ci -m "Merged with Goofy" 

-- o --- A --- B --- C 
    \   \ 
    D --------- M --- w 

Maintenant Mickey peut continuer à travailler sur C et modifier le commit quand il est prêt:

$ hg up C 
$ echo "final change" >> c.txt 
$ hg ci --amend -m "Finished working on c.txt" 

A partir de là, Mickey peut soit fusionner, soit rebaser (en passant, fusionner avec Goofy pourrait aussi être un rebasage).

+0

L'option "--amend" que je n'ai jamais vu - et HG 2.1.2 ne le reconnaît pas. Est-ce une nouvelle option? –

+0

@PeterToft: '--amend' a été introduit dans [Mercurial 2.2] (http://mercurial.selenic.com/wiki/WhatsNew#Mercurial_2.2_.282012-05-01.29), il ya environ un mois. Ce n'est pas que l'effet ne peut pas être obtenu par d'autres moyens, mais c'est très pratique. En l'absence de cette option, vous pouvez utiliser MQ ('qimport',' qrefresh', puis 'qfinish'). – Helgi

Questions connexes