Tutorial - Effettuare il merge di modifiche

In TutorialEsportare abbiamo imparato come condividere una modifica con altre persone, tuttavia, da quando con la versione 0.7 import non è stato più adeguato per effettuare correttamente il merge di e-mail pesanti, stiamo per mostrare come effettuare il merging attraverso il pull da un altro repository che contiene una modifica incompatibile.

Dapprima dobbiamo creare qualcosa da unire, ossia sulla quale effettuare il merge. Cloniamo di nuovo il repository my-hello:

$ cd ..
$ hg clone my-hello my-hello-desc

Aggiungiamo semplicemente un commento a hello.c.

$ cd my-hello-desc
$ vi hello.c

Cambiamo la seconda linea da così

  hello.c

a così:

$ hello.c - hello, world

Salviamo e usciamo dall'editor e effettuiamo il commit della nostra modifica. Questa volta usiamo il comando commit -m, per evitare di dover entrare in un editor di testo:

$ hg commit -m "Add description of hello.c"

A questo punto abbiamo fatto una modifica a hello.c nel repository my-hello-new-output e un'altra modifica a hello.c in my-hello-desc (cfr. Branch). Come effettuare il merge di queste due linee diverse di uno stesso progetto? Ci sarà qualche problema quando effettueremo il pull da un repository all'altro?

Vediamo che succede se facciamo il pull delle modifiche di my-hello-new-output mentre siamo ancora in my-hello-desc:

$ hg pull ../my-hello-new-output
pulling from ../my-hello-new-output
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)

Somiglia all'output del pull visto in TutorialCondividereModifiche! Allora ci resta da fare solo un aggiornamento, vero?

$ hg update
abort: update spans branches, use 'hg merge' or 'hg update -C' to lose changes

No, qualcosa è successo. Mercurial ci dice chedobbiamo unire le modifiche fatte in ogni repository. Sembra complesso, vero? Tuttavia è molto semplice! Seguiamo le istruzioni dell'ultima linea di output:

$ hg merge
merging hello.c
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)

(Per gli utenti Win: Mercurial manca di un programma d merge, se si verifica un errore tipo questo hgmerge is not recognized as an internal or external command. Guardare MergeProgram per informazioni su come correggere il problema)

Questo è tutto! Mercurial poteva farlo automaticamente richiamando lo script hgmerge o qualsiasi sia il nostro programma di merge. A seconda del tuo ambiente, hgmerge richiama lo strumento che risolve graficamente il merge. Se consideriamo hello.c, troviamo che contiene entrambe le modifiche provenienti da my-hello-new-output e da my-hello-desc.

(N.B.: prima della versione di Mercurial 0.9, si sarebbe dovuto usare hg update -m al posto di hg merge ).

Quando lavoriamo con le modifiche fatte da molte altre persone questo tipo di merge sarà quello con il quale dovremo avere a che fare più spesso. Non dimentichiamo di commentare le nostre modifiche al repository, come suggerito nell'ultima linea di output da hg merge:

$ hg commit -m "Merged changes from my-hello-new-output"

Non dovrebbe esserci un output qualsiasi per questo tipo di comando.

Per mostrare le modifiche della nostra operazione di merge, usiamo il comando annotate per vedere le informazioni sul changeset linea per linea. Nel nostro caso notare che è la seconda revisione la nostra modifica al repository my-hello-desc e la terza revisione è la modifica su cui sn state svolte le operazioni di pull e di merge dal repository my-hello-new-output al repository my-hello-desc.

$ hg annotate hello.c
0: /*
2:  * hello.c - hello, world
0:  *
0:  * Placed in the public domain by Bryan O'Sullivan
0:  *
0:  * This program is not covered by patents in the United States or other
0:  * countries.
0:  */
0:
0: #include <stdio.h>
0:
0: int main(int argc, char **argv)
0: {
0:      printf("hello, world!\n");
3:      printf("sure am glad I'm using Mercurial!\n");
0:      return 0;
0: }

Continuiamo a imparare come gestire l'evenienza di conflitti tra modifiche in TutorialConflitti.


CategoryItalian

TutorialEffettuareMerge (last edited 2009-05-19 19:31:03 by localhost)