2011-02-09 14 views
16

Prendiamo un semplice esempio: sto lavorando sul ramo predefinito, ho eseguito alcuni changeset a livello locale e ne ho estratto altri dal repository principale. Ho lavorato per qualche giorno nel mio repository locale isolato, quindi ci sono alcune modifiche da unire prima di poter reinserire i miei risultati in master.Unisce la direzione in Mercurial?

default ---o-o-o-o-o-o-o-o-o-o-o (pulled stuff) 
      \ 
      o----o------------o (my stuff) 

Ora posso fare due cose.

Opzione # 1:

hg pull 
hg merge 

Risultato # 1:

default ---o-o-o-o-o-o-o-o-o-o-o 
      \     \ 
      o----o------------o-O 

Opzione # 2:

hg pull 
hg update 
hg merge 

Risultato # 2:

default ---o-o-o-o-o-o-o-o-o-o-o-O 
      \     /
      o----o------------o 

Questi due risultati mi sembrano isomorfi, ma in pratica sembra che l'opzione n. 2 si traduca in piccoli changeset (perché applica solo le mie poche modifiche alla linea principale invece di applicare tutte le modifiche mainline ai miei pochi).

La mia domanda è: questo importa? Dovrei preoccuparmi della direzione della mia fusione? Sto risparmiando spazio se faccio questo? (Fare hg log --patch --rev tip dopo l'unione suggerisce così.)

risposta

14

Sono (effettivamente) identici. Vedete una differenza nella dimensione dell'output hg log --patch --rev X perché log mostra il diff del risultato e (arbitrariamente) il suo genitore 'left' (ufficialmente p1), ma non è così che viene memorizzato (Mercurial ha un formato di archiviazione diff binaria che non è patch/diff based) ed è ora come viene calcolato (p1, p2, e most-recent-common-ancestor sono tutti usati).

L'unica vera differenza è che se si utilizzano i rami denominati, il nome del ramo sarà quello del genitore sinistro.

2

C'è anche una differenza se si utilizzano i segnalibri. Quando si esegue un'unione, il ramo che si è il ramo che sta ricevendo le modifiche, quindi il nuovo changeset farà parte di quel ramo. Supose avete questa situazione:

default ---o-o-o-o-o-o-o-o-o-o-o -- Head: Rev 200 
      \ 
      o----o------------o -- Head: Rev 195, Bookmark: my-stuff 

Se si uniscono Rev 200 in Rev 195, il segnalibro my-stuff sarà passare a Rev 201, come si sta generando un nuovo changeset nello stesso ramo che ha il segnalibro.

D'altra parte, se si uniscono 195 in 200, si sta generando un changeset nel ramo che non ha il segnalibro. Il segnalibro my-stuff rimarrà in Rev 195.

+1

Ciò è particolarmente importante se si sta utilizzando [Hg-Git] (http://hg-git.github.com/), perché traccia la posizione dei rami virtuali di Git usando i segnalibri. Se ti unisci nel modo sbagliato, il segnalibro di ramo Git non si muoverà e non avrai nulla da spingere. –

+0

L'unione di 200 in 195 non è garantita per spostare il segnalibro in avanti a 201. Se si esegue 'hg update my-stuff; hg merge 200', ma se si esegue 'hg update 195; hg unione 200 'non lo farà. L'aggiornamento tramite il nome del segnalibro lo rende * attivo *. –

Problemi correlati