2009-12-17 14 views
22

Sto cercando di prendere l'abitudine di fare revisioni del codice, ma le fusioni hanno reso difficile il processo perché non so come chiedere a Mercurial di "mostrare solo i cambiamenti introdotti dall'unione che non erano presenti in nessuno dei due i suoi genitori. "Mercuriale: come posso vedere solo le modifiche introdotte da un'unione?

Oppure, un po 'più formale (grazie a Steve Losh):

Mostrami ogni pezzo in unione che non era presente in nessuno dei suoi genitori, e mi mostra ogni pezzo presente in uno dei suoi genitori che non è presente anche in 3.

Ad esempio, si supponga di avere un repository con due file, a e b. Se "a" viene modificato nella revisione 1, "b" viene modificato nella revisione 2 (che si trova su un ramo separato) e queste due modifiche vengono unite nella revisione 3, otterrò una cronologia che assomiglia a questa:

 @ changeset: 3 
    |\ summary:  Merged. 
    | | 
    | o changeset: 2 
    | | summary:  Changing b 
    | | 
    o | changeset: 1 
    |/ summary:  Changing a 
    | 
    o changeset: 0 
     summary:  Adding a and b

Ma se chiedo di vedere le novità introdotte dalla versione 3, hg di -c 3, Mercurial mi mostrerà la stessa cosa se ho chiesto di vedere le modifiche introdotte nella revisione 1, hg di -c 1:

 $ hg di -c 3 
    --- a/a  
    +++ b/a  
    @@ -1,1 +1,1 @@ 
    -a 
    +Change to a 
    $ hg di -c 1 
    --- a/a  
    +++ b/a  
    @@ -1,1 +1,1 @@ 
    -a 
    +Change to a

Ma, ovviamente, questo non è molto utile - invece, mi piacerebbe sapere che nessuna nuova modifica è stata introdotta dalla revisione 3 (o, se c'è stato un conflitto durante la erge, mi piacerebbe vedere solo la risoluzione di quel conflitto). Qualcosa di simile:

 $ hg di -c 3 
    $

Quindi, come posso fare questo?

ps: so che posso ridurre il numero di fusioni nel mio repository utilizzando rebase ... Ma non è un problema mio - il mio problema è capire cosa è stato modificato con una fusione.

+0

Sembra un comando molto utile. Non vedo l'ora che arrivi la risposta. –

+1

Domanda simile: [In mercuriale, come vedere la differenza tra un changeset di unione e un genitore senza modifiche dall'altro genitore?] (Http://stackoverflow.com/q/4329230/151299) –

+5

Ho finito per scrivere un plugin di mergediff: http://mercurial.selenic.com/wiki/MergediffExtension –

risposta

12

La risposta breve: non è possibile farlo con qualsiasi comando Mercurial di serie.

In esecuzione hg diff -c 3 mostrerà le modifiche tra 3 e il suo primo genitore - cioè il changeset che eravate quando è stato eseguito hg merge.

Questo ha senso quando si pensa ai rami come qualcosa di più di semplici changeset. Quando esegui hg up 1 && hg merge 2, stai dicendo a Mercurial: "Unisci il set di modifiche 2 nel set di modifiche 1".

È più ovvio se si utilizzano filiali denominate. Il changeset 2 nel tuo esempio era su un ramo denominato rewrite-ui. Quando esegui hg update 1 && hg merge rewrite-ui stai dicendo efficacemente: "Unisci tutte le modifiche nel ramo rewrite-ui nel ramo corrente". Quando esegui in seguito hg diff -c su questo changeset, viene visualizzato tutto ciò che è stato introdotto nel ramo default (o in qualsiasi altro ramo si trovi 1) dall'unione, il che ha senso.

Dalla tua domanda, però, sembra che si stia cercando un modo per dire:

Mostrami ogni pezzo in questo changeset che non era presente in nessuno dei suoi genitori, e mi mostra ogni pezzo presente in uno dei suoi genitori che non è presente anche in 3.

Questa non è una cosa semplice da calcolare (non sono nemmeno sicuro di aver ottenuto la descrizione proprio ora). Posso sicuramente vedere come sarebbe utile, però, quindi se puoi definirlo in modo inequivocabile potresti convincere uno di noi che contribuisci Mercurial a leggere SO per implementarlo.

+0

Hrm, sembra che mi sia dimenticato di dire l'ovvio prima: grazie per la risposta. In ogni caso, hai sentito da qualche deviatore di HG che potrebbe essere interessato a sbattere qualcosa? Oppure, in alternativa, faresti (o qualcun altro?) Mente se li ho infastiditi mentre cerco di capire come implementarlo? –

+0

Sarei interessato perché sarebbe davvero bello avere un "merge diff" valido per l'estensione hg-review su cui sto lavorando. Sono sjl su #mercurial su freenode - mi ha colpito. –

+1

Ci scusiamo per la risposta tardiva ... Ma alla fine ho scritto un tale plugin: http://mercurial.selenic.com/wiki/MergediffExtension –

0

Per poter eseguire revisioni di codice, si desidera veramente visualizzare solo le modifiche nel progetto che si sta esaminando. A tal fine, utilizziamo un nuovo ramo per ciascuna storia e usiamo le richieste pull per mettere in evidenza le modifiche, dopo aver unito tutte le modifiche al ramo della storia prima di creare la richiesta pull. Ospitiamo il nostro codice su bitbucket e gli strumenti di richiesta di revisione/pull sono davvero molto buoni, offrendo una differenza affiancata.

Pull requests with side-by-side diffs

Problemi correlati