Modulo 07 — Merging
Il concetto
Section titled “Il concetto”I branch creano contesti isolati, ma prima o poi le modifiche di un branch vanno incorporate in un altro. Il comando è git merge.
Due concetti chiave per non confondersi:
- Si mergiano branch, non commit specifici.
- Il merge avviene SEMPRE nel branch corrente (quello puntato da HEAD).
I passi
Section titled “I passi”Per portare le modifiche di bugfix dentro master:
git switch master # 1. vai sul branch "ricevente"git merge bugfix # 2. mergia il branch sorgente nel correnteFast-forward
Section titled “Fast-forward”Se master non ha nuovi commit rispetto al punto in cui bugfix si è staccato, Git non crea nulla: avanza semplicemente il puntatore di master fino all’ultimo commit di bugfix. I due branch finiscono per puntare allo stesso commit — finché non divergeranno di nuovo. Questo si chiama fast-forward: master “rincorre” i commit di bugfix.
Merge commit
Section titled “Merge commit”Se invece entrambi i branch hanno nuovi commit (es. un collega ha mergiato una feature su master mentre tu lavoravi sul tuo branch), il fast-forward non è possibile: Git crea un dedicato merge commit — un commit che ha due genitori e fonde le due linee. Ti verrà chiesto un messaggio.
Entrambi i branch hanno commit propri rispetto all’antenato comune: serve un merge vero e proprio.
Il risultato: un commit unico che unisce le due linee, con due genitori.
Merge conflicts
Section titled “Merge conflicts”A seconda delle modifiche, Git può non riuscire a mergiare automaticamente: nascono conflitti. Il terminale segnala:
CONFLICT (content): Merge conflict in blah.txtAutomatic merge failed; fix conflicts and then commit the result.E i file coinvolti vengono modificati con i marker di conflitto:
<<<<<<< HEADI have 2 catsI also have chickens=======I used to have a dog :(>>>>>>> bug-fix- Tra
<<<<<<< HEADe=======: il contenuto del branch corrente (quello che riceve il merge). - Tra
=======e>>>>>>>: il contenuto del branch sorgente.
Come risolvere un conflitto
Section titled “Come risolvere un conflitto”- Apri i file con conflitti.
- Modifica i file decidendo cosa tenere in ogni conflitto (contenuto di un branch, o entrambi).
- Rimuovi i marker di conflitto.
git adddei file risolti e poi commit per concludere il merge.
Eliminare il branch mergiato
Section titled “Eliminare il branch mergiato”A merge concluso, il branch sorgente può essere eliminato (git branch -d): i suoi commit vivono ormai nella history del branch ricevente.
Immagini: documentazione ufficiale di Git (git-scm.com, dal libro Pro Git di Scott Chacon), licenza CC BY-NC-SA 3.0.