Corso
Se hai lavorato a un progetto con più sviluppatori (o anche solo gestito più funzionalità da solo), sai che creare branch è essenziale per mantenere l'ordine. Ma a un certo punto, tutti quei branch devono ricongiungersi—ed è qui che entra in gioco git merge.
In questo tutorial, passerò in rassegna i diversi tipi di merge in Git, come funzionano e come risolvere i conflitti di merge quando le cose non vanno come previsto. Infine, condividerò alcune best practice per usare git merge in modo efficace ed evitare le insidie più comuni.
Che cos'è git merge?
In un team, gli sviluppatori spesso lavorano su funzionalità, correzioni di bug e miglioramenti in branch separati. Una volta terminato il lavoro, utilizzano git merge per integrare tali modifiche.
Il merge combina le modifiche di un branch in un altro preservando l'intera cronologia delle versioni. Unifica la cronologia dei commit di entrambi i branch.
Vediamo il flusso di lavoro con un esempio.

Un commit base comune si dirama in due branch, portando a puntatori separati di main e feature prima del merge. Immagine dell'autore.
Nell'immagine sopra, i branch feature e main hanno creato nuovi commit da quando è stato creato il branch feature.

Un branch feature e il branch main divergono da una base comune e vengono poi combinati in un unico merge commit. Immagine dell'autore.
Git merge prende tutti i nuovi commit di entrambi i branch, a partire dalla loro base comune, e li combina in un unico merge commit. Quindi aggiorna il puntatore head per puntare a questo nuovo merge commit.
Uso base del comando git merge
Fare un merge non significa solo eseguire git merge e chiuderla lì—ci sono alcuni passaggi fondamentali per mettere tutto in ordine prima. In questa sezione vedremo l'intero processo, dalla preparazione dei branch al completamento di un merge riuscito.
Passaggio 1: prepararsi a un merge
Solo le modifiche già committate in entrambi i branch possono essere unite. Quindi usa il comando git status per controllare se ci sono modifiche non committate e committale con il comando git commit prima del merge.

Passaggio 2: fare checkout del branch di destinazione
Prima di eseguire git merge, dovresti passare al branch di destinazione, di solito il branch main. Passa al branch main usando git checkout main o git switch main.
Passaggio 3: eseguire il merge di un branch
Assicurati che il branch main sia allineato con il repository remoto. Per farlo, esegui git pull origin main.
Ora sei finalmente pronto a unire il branch feature nel branch main! Puoi usare un comando come il seguente:
git merge feature-branch
Passaggio 4: risolvere i conflitti di merge (se presenti)
Git prova a risolvere automaticamente i conflitti che possono verificarsi durante i merge. Tuttavia, può essere necessario intervenire manualmente quando non riesce a risolverli da solo.
Per esempio, se le stesse righe nello stesso file sono state modificate in branch diversi, possono verificarsi conflitti di merge.
Quando Git rileva un conflitto, mette in pausa il merge e ti chiede di risolverlo. In tal caso:
- Esegui
git statusper vedere quali file hanno conflitti. - Apri quei file.
- Rivedi le righe di codice in conflitto e aggiornale per garantire coerenza tra i due branch.
Passaggio 5: fare il commit del merge
Dopo aver risolto i conflitti, usa il comando git add . per aggiungere all'area di stage i file corretti. Poi completa il merge effettuando un commit con un messaggio:
git merge -m “resolved conflicts”
Nelle sezioni successive vedremo più nel dettaglio come risolvere i conflitti di merge.
Per i principianti, ecco un Git cheat sheet completo che copre tutti i comandi essenziali per creare, aggiornare, eliminare e gestire i branch.
Se hai già un po' di esperienza con Git e ti serve un ripasso dei comandi importanti, dai un'occhiata a questo tutorial con i comandi Git più usati con esempi.
Tipi di merge in Git
Capire i tipi di merge in Git ti aiuterà a scegliere la strategia giusta per il tuo scenario. Ecco i tre approcci più comuni al merge.
Fast-forward merge
Quando il branch di base non ha nuovi commit da quando è stato creato il branch feature, Git usa un approccio fast-forward.
Se il tuo nuovo branch feature viene aggiornato mentre il branch main resta invariato, il merge sposta il puntatore head di main al branch feature.
Non viene creato alcun merge commit aggiuntivo, il che mantiene la cronologia dei commit pulita e lineare.
Three-way merge
Se sia il branch di base sia il branch feature hanno nuovi commit, Git troverà il loro antenato comune e creerà un nuovo merge commit. Questo commit combina le cronologie di entrambi i branch, preservando la cronologia del branch feature e del branch main.
Nell'esempio seguente, “E” e “G” sono nuovi commit sul branch main dopo la creazione del branch feature.
C---D---F (feature-branch)
/
A---B---E---G (main)
Viene creato un nuovo merge commit, “M”, che preserva la cronologia di entrambi i branch main e feature.
C---D---F
/ \
A---B---E---G---M (main)
Squash merge
Lo squash merge combina tutte le modifiche di un branch feature in un singolo commit e lo unisce nel branch di destinazione. Non preserva la cronologia dei singoli commit del branch feature.
git merge --squash feature_branch_name
Uno squash merge è particolarmente utile per evitare l'ingombro dovuto a molti piccoli commit, mantenendo comunque lo stato finale della feature nel branch di destinazione.
Unire più branch
Nei progetti grandi, potresti dover unire più branch—uno alla volta o tutti insieme. L'approccio scelto dipende dal tuo flusso di lavoro e dalla complessità delle modifiche. In questa sezione esplorerò entrambi i metodi e quando usarli efficacemente.
Unire più di un branch in sequenza
Per unire i branch uno per uno, usa il comando di merge in sequenza per ciascun branch feature.
Passaggio 1: Passa al branch di destinazione nel quale vuoi unire le modifiche.
git checkout target_branch_name
Passaggio 2: Unisci il primo branch feature, come mostrato di seguito.
git merge feature_branch_1
Passaggio 3: Unisci il secondo branch feature come mostrato.
git merge feature_branch_2
Ripeti il processo finché tutti gli altri branch non sono stati uniti.
Unire più di un branch in parallelo
Segui questi passaggi per unire più branch feature in una volta sola.
Passaggio 1: Passa al branch di destinazione nel quale vuoi unire le modifiche.
git checkout target_branch_name
Passaggio 2: Esegui il seguente comando con più branch feature
git merge feature_branch_1 feature_branch_2 feature_branch_3
Quando Git unisce più branch in parallelo, possono verificarsi conflitti. In tal caso, Git ti chiederà di risolverli manualmente.
Gestire i conflitti con merge multipli
Unire più branch non è sempre semplice—soprattutto quando un branch dipende da un altro.
Per esempio, unire feature_x in main prima di feature_y può introdurre conflitti. Allo stesso modo, se branch diversi modificano gli stessi file, i merge paralleli possono portare a conflitti che richiedono una risoluzione attenta.
Segui questi passaggi per risolvere i conflitti di merge:
- Passaggio 1: esegui
git statusper vedere quali file causano conflitti. - Passaggio 2: apri i file in conflitto e correggili.
- Passaggio 3: aggiungi le modifiche allo stage e fai il commit.
Capire la cronologia dei merge commit
Per conflitti complessi, potresti aver bisogno di più informazioni di quelle fornite da git status. In questi casi, puoi usare comandi come git log o git show per approfondire la cronologia.
git log: mostra l'intera cronologia dei commit, inclusi i merge commit. Questo aiuta a identificare un merge specifico in cui si verifica il problema.git show: Se trovi un merge commit sospetto con il comando sopra, usagit showper ispezionarlo. Questo comando fornisce una vista dettagliata del commit, mostrando cosa è stato modificato durante il merge. Mostra anche un identificatore univoco per il branch padre prima che avvenga un determinato merge.git diff: Puoi prendere gli identificatori univoci dei branch padre e unito dai comandi precedenti e usaregit diffper confrontare le modifiche tra questi due stati.
Best practice per il merge in Git
Il merge a volte può risultare caotico, soprattutto quando più sviluppatori lavorano sullo stesso codebase.
Abbiamo visto come risolvere i conflitti quando si presentano, ma il modo migliore è prevenirli prima che accadano. In questa sezione vedremo consigli pratici per mantenere i merge scorrevoli e la cronologia di Git pulita.
Mantieni i branch piccoli e focalizzati
Branch molto grandi aumentano il rischio di sovrapposizione delle modifiche, portando a più conflitti. Per ridurre al minimo questo rischio, lavora su una singola funzionalità per branch e mantieni i branch piccoli e focalizzati.
Fai pull e merge frequentemente
Scarica le ultime modifiche dal repository remoto per mantenere aggiornato il tuo branch di base prima di eseguire il merge. Effettua regolarmente il pull degli aggiornamenti dal branch main nel tuo branch feature per tenerli sincronizzati. Questo previene conflitti ampi e complessi in seguito.
Usa gli strumenti di merge integrati in Git
Invece di modificare i file manualmente, puoi usare gli strumenti integrati di Git per risolvere i conflitti con un'interfaccia visuale. Quando esegui git mergetool, si aprono tre scelte:
- LOCAL - Versione del branch main. Scegliendo questa opzione mantieni il contenuto del file in conflitto dal branch main e ignori le modifiche del branch feature.
- REMOTE - Versione del branch feature. Selezionando questa opzione applichi al file in conflitto il contenuto del branch feature.
- BASE - Combina le modifiche dei file in conflitto di entrambi i branch e le unisce.
Unisci in ordine
Quando unisci più branch, l'ordine conta—soprattutto se una feature dipende da un'altra. Se feature_x dipende da feature_y, unire prima feature_x può introdurre conflitti. Per evitarlo, unisci sempre i branch seguendo l'ordine delle loro dipendenze, così da mantenere il processo fluido e ridurre al minimo i conflitti.
Squash merging
Come già accennato, lo squash merge consolida tutti i commit di un branch feature in un singolo commit, mantenendo pulita la cronologia dei commit e riducendo i potenziali conflitti di merge.
Un approccio alternativo è il rebase, che applica le modifiche del branch feature direttamente sopra il branch di base. In questo modo si crea una cronologia lineare ed evita merge commit non necessari. Tuttavia, entrambi i metodi riscrivono la cronologia e non preservano i singoli commit del branch feature.
Conclusione
In questo tutorial su Git merge, abbiamo visto tutto, dalle basi del merge alle best practice per evitare conflitti. Capire come usare git merge in modo efficace aiuta i team a collaborare senza intoppi, mantenendo flussi di lavoro fluidi e una cronologia del codice pulita.
Se vuoi approfondire le tue competenze su Git, dai un'occhiata a questo corso intermedio su Git per padroneggiare flussi di lavoro e tecniche più avanzati!
FAQ
Qual è la differenza tra git merge e git rebase?
Sebbene entrambi i comandi integrino le modifiche da un branch a un altro, git merge crea un nuovo merge commit, preservando la cronologia di entrambi i branch. Al contrario, git rebase applica i commit del branch feature direttamente sul branch di destinazione, ottenendo una cronologia lineare ma riscrivendo la cronologia nel processo.
Posso annullare un merge in Git?
Sì, se non hai ancora pushato il merge, puoi usare:
git reset --hard HEAD~1
Questo reimposta il tuo branch allo stato precedente al merge. Se il merge è già stato pushato, dovrai usare git revert per annullare in modo sicuro le modifiche mantenendo intatta la cronologia.
Come faccio a unire un branch remoto nel mio branch locale?
Per unire un branch remoto nel tuo branch locale, segui questi passaggi:
git fetch origin
git checkout my-branch
git merge origin/feature-branch
Questo garantisce che tu stia unendo gli aggiornamenti più recenti dal repository remoto.
Come posso prevenire conflitti di merge non necessari?
Per ridurre al minimo i conflitti:
- Scarica regolarmente le ultime modifiche prima di iniziare nuovo lavoro (
git pull). - Esegui il merge nell'ordine delle dipendenze se più branch dipendono l'uno dall'altro.
- Usa feature flag per integrare il codice progressivamente invece di mantenere branch a lunga vita.
Cosa succede se faccio il merge di un branch già unito?
Se un branch è già stato unito, eseguire di nuovo git merge feature-branch non cambierà nulla. Git riconoscerà che i branch condividono una cronologia comune e confermerà semplicemente che tutto è aggiornato.
Posso unire più branch in una volta sola?
No, Git non supporta l'unione di più branch con un singolo comando. Devi unirli in sequenza:
git merge feature-branch-1
git merge feature-branch-2
Se necessario, puoi creare un branch di integrazione in cui unisci più branch e poi unire quello in main.
Dovrei usare git merge --no-ff o git merge --ff?
--no-ff(no fast-forward merge) crea un nuovo merge commit, rendendo più facile tracciare la cronologia dei branch.--ff(fast-forward merge) applica direttamente le modifiche se possibile, evitando commit extra.
Per i progetti in cui è importante tracciare i branch feature, è consigliato --no-ff.
Srujana è una tech writer freelance con una laurea quadriennale in Informatica. Scrivere di vari argomenti, tra cui data science, cloud computing, sviluppo, programmazione, sicurezza e molti altri, le viene naturale. Ama la letteratura classica ed esplorare nuove destinazioni.


