2010-11-16 6 views
32

mia domanda è questa:Come unire per liberare la testa con la linea di comando di Mercurial, come posso fare con TortoiseHg?

  • Se ho due teste (rami con variazioni) nel mio repository Mercurial, e mi piacerebbe per sbarazzarsi di uno di loro, ma scartare tutte le modifiche da quel ramo invece di fonderli nell'altro, e non posso escludere quei changeset quindi devo unirmi, come posso farlo con il client della riga di comando?

Se ho due teste nel mio repository Mercurial, e utilizzare TortoiseHg come il mio cliente, il repository potrebbe assomigliare a questo:

two heads

Poi mi può sbarazzarsi del test2 testa facendo una fusione e scartando. In primo luogo vorrei aggiornare alla testa che vorrei mantenere (test3 in questo caso, che nell'immagine sopra è già l'attuale genitore della mia cartella di lavoro). Poi vorrei fare clic destro e selezionare "Unisci con ...":

merge with...

e, nella finestra che si apre avrei scelto di ignorare le modifiche della destinazione di unione (cioè il ramo I'. d come per scartare tutte le modifiche da):

merge dialog

Dopo questa unione è passato attraverso, tutti i cambiamenti nella testa test2 è stato scartato, e posso commettere. La testa è ora scomparsa, ma il changeset fa ancora parte della storia.

La mia domanda è questa: come posso fare la stessa cosa usando solo il client della riga di comando? Non riesco a trovare tutte le opzioni corrispondenti al comando 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 

Edit: debugsetparents lavorato bene:

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

Edit: Tentativo di utilizzare il secondo --tool internal:local a una delle risposte:

@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 

uscita di esecuzione:

 
[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 

Qui le modifiche introdotte nel 2 ° changeset (quello con numero di revisione 1), è ora presente nel changeset unito. Questo non è quello che volevo.

risposta

28

Secondo TortoiseHg di source, quando si controlla Discard all changes from merge target (other) revision, utilizza il comando 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 

Per utilizzare:

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

'hg debugsetparents. REV2' seguito da un 'hg merge' ha funzionato bene, grazie. –

+0

Molto utile per uno sviluppatore iOS, abbiamo utilizzato MacHG che non supporta la funzionalità "Elimina tutte le modifiche dalla revisione della destinazione di fusione (altro)". –

+9

Solo per il mio riferimento (come sono spesso qui, cercando di ricordarlo): si vuole eseguire 'hg debugsetparents '. Questo può essere dedotto dai documenti di aiuto ma non è esattamente * ovvio *. –

2

Aggiornare la directory di lavoro per la revisione che si desidera conservare , quindi:

hg merge --tool internal:local -r REVISION_TO_DISCARD 

Vedere la Mercurial tips and tricks alcune informazioni un po 'out-of-date: il --config ui.merge è ora fornita dall'opzione --tool per hg merge (è stato introdotto nella versione 1.7)

+2

Non sembra funzionare, permettimi di modificare la mia domanda per mostrare cosa ho fatto in base alla tua risposta qui. –

+0

@ LasseV.Karlsen possiamo prelevare da mercurial DVCS con l'autorizzazione utilizzando mercurial.net? Sto usando mercurial.net e ho postato una domanda, potresti aiutarmi per favore? – Sandepku

+0

Tutto ciò che puoi fare sulla riga di comando che puoi fare con mercurial.net, ma se hai bisogno di rispondere a una domanda su username e/o password potrebbe essere più difficile da fare. È passato un po 'di tempo da quando usavo mercurial da quando sono passato a git quindi non ne sono del tutto sicuro. –

1

Se non si desidera utilizzare debugsetparents, è possibile tornare manualmente al changeset si desidera mantenere prima di impegnarsi:

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

si noti, tuttavia, che questa tecnica non è necessariamente l'approccio migliore. Forse starai meglio solo chiudendo la testa:

hg up HEAD_YOU_WANT_TO_DISCARD 
hg commit --close-branch 

La documentazione qui è un po 'fuorviante; questo chiude solo la testa specifica, non l'intero ramo.

+0

'tip ^' non ha funzionato per me, ma invece ha specificato 'branch_to_keep'. Puoi anche eseguire il ripristino file per file, nel caso ce ne siano alcuni da mantenere. – murrayju

Problemi correlati