2009-07-03 8 views

risposta

50

ATTENZIONE: tale "unione fittizia", ​​come raccomandato da @ Martin-Gisler, può davvero rovinarti, se poi vuoi fare una vera unione dei due rami. L'unione fittizia verrà registrata e dirai che ti sei fuso nel ramo in cui hai effettuato l'unione fittizia: non vedrai le modifiche. O se ti unisci all'altro ramo, le modifiche su quell'altro ramo verranno annullate.

Se invece si è interessati a copiare un intero file da un ramo all'altro, si può semplicemente fare:

hg update -r to-branch 
    hg revert -r from-branch file 
    hg ci -m 'copied single file from from-branch to to-branch 

Se si desidera selezionare diverse parti di quel file, quindi "hg record" è utile.

L'ho appena fatto nella mia home directory .hgignore.

Se entrambi i rami hanno apportato modifiche a un file che si desidera conservare, un trucco sporco sarebbe creare un'unione dei due rami utilizzando hg merge, probabilmente/probabilmente su un altro ramo ancora, controllare quello dentro e quindi copiare un singolo file tra l'unione e il ramo a-:

hg update -r to-branch 
    branch merge-branch 
    hg merge -r from-branch 
    hg ci -m 'temp merge to be discarded" 
    hg update -r to-branch 
    hg revert -r merge-branch single-file 
    hg ci -m 'merged single-file from from-branch to to-branch" 
    hg strip merge-branch 

vale la pena ricordare: il modo di "copiare un singolo file tra i rami" (o revisioni, o dalla revisione di fondere, o ... .) è "hg revert". Cioè

hg update -r Where-you-want-to-copy-to 
    hg revert -r Where-you-want-to-copy-from file-you-want-to-copy 
    ... 
    hg ci 

Per qualche ragione io, e alcuni dei miei colleghi, trovare questo MOLTO confusione. "ripristina" == "copia" ... ha senso per alcuni schemi di utilizzo, ma non per tutti.

+2

Questa dovrebbe essere la risposta accettata invece di quello che ha dato Martin Geisler, anche se in realtà non unirà il file, copiare è ciò che si vorrebbe fare la maggior parte del tempo e non rovinerebbe il ramo. – noamik

+2

Questo ha funzionato alla grande per portare un singolo file da un ramo a Una cosa che noto, comunque, è che il check-in del bagagliaio non sembra comparire nella cronologia del file, il che è sfortunato: –

+0

ciao e grazie per la risposta, tuttavia ho dei problemi nella mia situazione il ramo sorgente contiene un file che non esiste nel mio ramo predefinito, ma voglio copiarlo senza unire il resto del ramo. Quando provo a fare ciò che hai descritto, io ottengo 'nessun file in questo modo' Qualche suggerimento? – propagated

18

No. Mercurial funziona su base changeset.

Ma è possibile eseguire un "dummy merge" in cui si ignorano le modifiche in entrata da uno dei rami. Prima di impegnarsi si potrebbe quindi ripristinare i file selezionati per qualsiasi stato che si desidera:

% HGMERGE=internal:local hg merge  # keep my files 
% hg revert --rev other-branch a.txt # update a.txt to other branch 
% hg commit -m 'Dummy merge to pick a.txt from other-branch.' 

Forse che vi aiuterà un po '.

+2

ATTENZIONE: un "fittizio merge" come può davvero rovinare in su , se più tardi vuoi fare una vera fusione tra i due rami. L'unione fittizia verrà registrata e dirai che ti sei fuso nel ramo in cui hai effettuato l'unione fittizia: non vedrai le modifiche. O se ti unisci all'altro ramo, le modifiche su quell'altro ramo verranno annullate. // Se tutto quello che vuoi è copiare un intero file da un ramo all'altro, puoi semplicemente "hg update -r to-branch; hg revert -r file" // se vuoi selezionare parti differenti di quel file , quindi "hg record" è utile. // L'ho appena fatto nella mia home directory .hgignore. –

+0

Uno stratagemma sarebbe creare un'unione dei due rami usando hg merge, controllarlo e quindi copiare un singolo file tra l'unione e il ramo usando "hg update -t ​​to-branch; branch merge-branch ; hg merge -r from-branch; hg ci -m 'temp si unisce per essere scartato "; hg update -r to-branch; hg revert -r merge-branch single-file-u-want; hg ci -m 'un singolo file unito da ramo a ramo'; hg strip merge-branch –

+1

Oh, diamine, potrei anche rendere i miei commenti una vera risposta –

1

Vorrei semplicemente utilizzare uno strumento esterno come vimdiff per diffare i due file che voglio unire e quindi unirli. Il vantaggio di questo è che puoi apportare modifiche selettive su parti del file. Ad esempio:

hg update -r branch-merging-to 
hg extdiff -p vimdiff -r branch-merging-from file-I-am-merging 

Per fare questo è necessario attivare gli strumenti esterni nel vostro .hgrc, che significa semplicemente aggiungendo queste righe:

[extensions] 
hgext.extdiff =