2013-05-31 4 views
5

Vorrei innestare un changeset unione:Come innestare un changeset fusione con Mercurial

$ hg graft -UD --log -r 1909 
skipping ungraftable merge revision 1909 

La mia soluzione è:

hg export -r 1909 | hg import - 
hg commit -m"$(hg log -r 1909 --template 'grafted {node}')" 

C'è una ragione per cui l'innesto di un changeset merge non è supportato ?

risposta

3

I gruppi di scambio di unione hanno due genitori e quindi due modi diversi di guardare a cosa è cambiato. Per impostazione predefinita se si utilizza hg diff -c <changeset> verrà mostrato il diff rispetto al primo genitore che in genere rappresentava la directory di lavoro al momento dell'unione. Se questa ipotesi è sbagliata, è un modo semplice per introdurre errori.

Questo porta alla domanda sul perché si sta innestando un set di modifica unione e non i changeset originali stessi. Se sono presenti una serie di changeset da innestare e si utilizza il changeset di unione per "rollup" di quella serie, è possibile innestare le modifiche multiple originali contemporaneamente: hg graft "1000::1005".

Personalmente, io di solito uso hg rebase per attività di questo tipo, anche se questo richiede che consente l'estensione rebase nel vostro hgrc o mercurial.ini:

[extensions] 
rebase= 
+4

La motivazione è che l'innesto il changeset unione è più facile che la fusione del innestando singoli changeset. Ci sono anche situazioni in cui l'innesto di changeset individuali dal secondo ramo non è ovvio. Nel mio caso rebase non è applicabile. I changeset sono già pubblici. –

+0

Ho un'unione in cui sono presenti conflitti di unione difficili da risolvere. Voglio sapere come innestare quel changeset di fusione perché la risoluzione funzionerebbe contro un vecchio p1() invece di rifare il lavoro della risoluzione del conflitto di fusione, ma sembra che non sia un'opzione. – binki