Tutorial Git - Unire rami

  1. Avanti veloce git merge
  2. Ricorsivo git merge
  3. Risolvere i conflitti

Impareremo a fondere i rami e anche a risolvere i conflitti, se esiste in questo tutorial.

Nell’ultimo tutorial, quello che abbiamo fatto è stato creare un nuovo ramo per lavorare su alcune nuove caratteristiche che non vogliamo incasinare il ramo master.

Dopo che abbiamo creato questi nuovi rami e siamo soddisfatti delle nuove funzionalità, abbiamo bisogno di fonderlo di nuovo nel ramo master. In modo che quando pubblicheremo il codice della prossima release, anche la nuova funzionalità sarà inclusa.

Avanti veloce git merge

Diciamo che siamo contenti dei cambiamenti nel ramo new_test_branch e lo fonderemo di nuovo al master.

  • Guarda il ramo master
    $ git checkout master
    
  • Unire il ramo al master
    $ git merge new_test_branch
    Updating 5fef94e..e7a7e81
    	Fast-forward
    	test3.txt | 3 ++-
    	1 file changed, 2 insertions(+), 1 deletion(-)
    

Abbiamo preso la funzionalità dal ramo new_test_branch e l’abbiamo fusa in questo ramo master.

Il Fast-forward mostrato nel messaggio dopo la fusione significa che git fa l’avanzamento veloce fino alle modifiche di codice che abbiamo fatto nel ramo, perché nel tempo che intercorre tra la ramificazione e la fusione di nuovo in master, non abbiamo effettivamente fatto alcuna modifica nel ramo master.

Ricorsivo git merge

Prima di dimostrare questa diversa git merge, dobbiamo creare due rami test_branch_A e test_branch_B e apportare diverse modifiche. Poi fonderemo il test_branch_A di nuovo al ramo master.

Ora fonderemo la test_branch_B al master.

$ git merge test_branch_B
Merge made by the 'recursive' strategy.
 test1_rename.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

La differenza tra questa fusione e la fusione fast-forward è che la fusione è fatta dalla strategia ricorsiva perché questo codice di ramo non ha la caratteristica test_branch_A in esso. In altre parole, il ramo master è cambiato dopo la creazione del ramo test_branch_B.

Ora master è aggiornato con entrambe queste due caratteristiche, e non importa che ci abbiamo lavorato allo stesso tempo, persone diverse che le hanno fatte con entrambe le caratteristiche si sono appena fuse e tutto va bene.

Risolvere i conflitti

Quello che abbiamo modificato in due rami di prova non ha alcun conflitto, ma cosa succede se ci sono conflitti quando si uniscono alcuni rami al master?

Creiamo due rami test_branch_C e test_branch_D, poi aggiungiamo il testo The letter should be C al file test3.txt nel ramo test_branch_C e aggiungiamo il testo The letter should be D al file test3.txt nel ramo test_branch_D.

Poi uniamo di nuovo il test_branch_C nel ramo master.

Ora, fonderemo test_branch_D nel master,

$ git merge test_branch_D
Auto-merging test3.txt
CONFLICT (content): Merge conflict in test3.txt
Automatic merge failed; fix conflicts and then commit the result.

Si vedeva qui che non poteva essere unito con successo perché rileva il conflitto nel file test3.txt. Dobbiamo risolvere manualmente il conflitto modificando il file in conflitto.

Il file test3.txt mostra il conflitto come

<<<<<<< HEAD
The letter should be C
=======
The letter should be D
>>>>>>> test_branch_D

Il testo tra HEAD e ======= è il testo del ramo master che proviene dal ramo test_branch_C, che differisce dal testo del ramo test_branch_D, che è quello del ramo test_branch_D.

È necessario scegliere quale testo deve essere conservato nel master, e cancellare tutti i simboli come <<<< e >>>>.

Diciamo che il testo allegato deve essere The letter should be D. Aggiorniamo l’area in conflitto con il testo The letter should be D.

Dopo aver risolto il conflitto, potremmo commettere il conflitto risolto usando git commit.