2010-11-16 25 views
32

Ma question est la suivante:Comment fusionner pour se débarrasser de la tête avec la ligne de commande Mercurial, comme je peux le faire avec TortoiseHg?

  • Si j'ai deux têtes (branches avec des changements) dans mon dépôt Mercurial, et je voudrais vous débarrasser de l'un d'eux, mais rejettent toutes les modifications de cette branche à la place de les fusionner dans l'autre, et je ne peux pas effacer ces changesets donc je dois fusionner, comment puis-je faire cela avec le client en ligne de commande?

Si j'ai deux têtes dans mon dépôt Mercurial, et utiliser TortoiseHg comme mon client, le dépôt pourrait ressembler à ceci:

two heads

Alors je peux me débarrasser de la test2 tête en faisant une fusion et de jeter. Je voudrais d'abord mettre à jour à la tête que je voudrais garder (test3 dans ce cas, qui dans l'image ci-dessus est déjà le parent actuel de mon dossier de travail). Alors je le clic droit et sélectionnez « Fusionner avec ... »:

merge with...

et dans la boîte de dialogue qui apparaît, je choisirais d'annuler les modifications de la cible de fusion (la branche I ». souhaitez rejeter tous les changements de):

merge dialog

Après cette fusion a connu, tous les changements dans la tête test2 a été mis au rebut, et je peux commettre. La tête a maintenant disparu, mais le changeset fait toujours partie de l'histoire.

Ma question est la suivante: Comment puis-je faire la même chose en utilisant seulement le client en ligne de commande? Je ne peux pas trouver toutes les options correspondant à la commande hg merge:

 
hg merge [-P] [-f] [[-r] REV] 

merge working directory with another revision 

... snipped text 

options: 

-f --force  force a merge with outstanding changes 
-t --tool VALUE specify merge tool 
-r --rev REV  revision to merge 
-P --preview  review revisions to merge (no merge is performed) 
    --mq   operate on patch repository 

use "hg -v help merge" to show global options 

Modifier: debugsetparents travaillé bien:

 
hg debugsetparents . 1 
hg commit -m "merged to get rid of changeset #1" 

Modifier: Tentative d'utilisation du --tool internal:local selon à l'une des réponses:

@echo off 

setlocal 
if exist repo rd /s /q repo 
hg init repo 
cd repo 

rem revision 0 
echo >test1.txt 
hg commit -m "test1" --addremove 

rem revision 1 
echo >test2.txt 
hg commit -m "test2" --addremove 

rem revision 2 
hg update 0 
echo >test3.txt 
hg commit -m "test3" --addremove 

rem now let's get rid of change in revision 1 with merge 
hg merge --tool internal:local -r 1 
hg commit -m "merged" 

dir 

sortie d'exécution:

 
[C:\Temp] :test 
adding test1.txt 
adding test2.txt 
0 files updated, 0 files merged, 1 files removed, 0 files unresolved 
adding test3.txt 
created new head 
1 files updated, 0 files merged, 0 files removed, 0 files unresolved 
(branch merge, don't forget to commit) 

Volume in drive C is unlabeled  Serial number is 0e17:6aba 
Directory of C:\Temp\repo\* 

16.11.2010 20:05    . 
16.11.2010 20:05    .. 
16.11.2010 20:05    .hg 
16.11.2010 20:05    13 test1.txt 
16.11.2010 20:05    13 test2.txt 
16.11.2010 20:05    13 test3.txt 
       39 bytes in 3 files and 3 dirs 12 288 bytes allocated 
    66 600 316 928 bytes free 

Ici, les changements introduits dans le 2ème changeset (celui avec le numéro de révision 1), est maintenant présent dans le changeset fusionné. Ce n'est pas ce que je voulais.

Répondre

28

Selon ce source TortoiseHG, lors de l'enregistrement Discard all changes from merge target (other) revision, il utilise la commande hg debugsetparents:

hg debugsetparents REV1 [REV2] 

manually set the parents of the current working directory 

    This is useful for writing repository conversion tools, but should be used with care. 

    Returns 0 on success. 

use "hg -v help debugsetparents" to show global options 

Pour utiliser:

hg up <revision-to-keep> 
    hg debugsetparents <revision-to-keep> <revision-to-throw-away> 
    hg commit -m "Merge to discard ..." 
+1

'hg debugsetparents. REV2' suivi d'un 'hg merge' a bien fonctionné, merci. –

+0

Très utile pour un développeur iOS, nous utilisons MacHG qui ne prend pas en charge la fonction "Supprimer toutes les modifications de la révision de la cible de fusion (autre)". –

+9

Juste pour ma propre référence (comme je suis souvent revenu ici, essayant de m'en souvenir): on veut exécuter 'hg debugsetparents '. Cela peut être déduit de l'aide docs mais n'est pas vraiment * évident *. –

2

Mettez à jour votre répertoire de travail à la révision que vous souhaitez conserver , puis:

hg merge --tool internal:local -r REVISION_TO_DISCARD 

Voir la Mercurial tips and tricks pour un peu out-of-date de l'information: l'--config ui.merge est maintenant fourni par l'option --tool à hg merge (il a été introduit dans la version 1.7)

+2

Cela ne semble pas fonctionner, laissez-moi éditer ma question pour montrer ce que j'ai fait selon votre réponse ici. –

+0

@ LasseV.Karlsen pouvons-nous tirer de DVCS mercurial avec autorisation en utilisant mercurial.net? J'utilise mercurial.net et posté une question, pourriez-vous m'aider s'il vous plaît? – Sandepku

+0

Tout ce que vous pouvez faire sur la ligne de commande, vous pouvez le faire avec mercurial.net, mais si vous avez besoin de répondre à une question sur le nom d'utilisateur et/ou mot de passe, il peut être plus difficile à faire. Ça fait longtemps que j'ai utilisé mercurial depuis que je suis passé à git alors je ne suis pas tout à fait sûr. –

1

Si vous ne souhaitez pas utiliser debugsetparents, vous pouvez revenir manuellement à la changeset que vous souhaitez conserver avant de vous engager:

hg merge --tool internal:local -r HEAD_YOU_WANT_TO_DISCARD 
hg revert -r 'tip^' 
hg commit 

Notez, cependant, que cette technique n'est pas nécessairement la meilleure approche. Il vaut peut-être mieux fermer simplement la tête:

hg up HEAD_YOU_WANT_TO_DISCARD 
hg commit --close-branch 

La documentation ici est un peu trompeuse; ceci ferme seulement la tête spécifique, pas la branche entière.

+0

'tip ^' n'a pas fonctionné pour moi, mais en spécifiant 'branch_to_keep' à la place. Vous pouvez aussi faire la restauration fichier par fichier, au cas où vous voudriez en conserver quelques-uns. – murrayju