Sinossi
git merge [--no-ff] [--squash] [--abort] [-s <strategy>] [<branch>]
Descrizione
Il comando git merge integra modifiche da un branch a un altro. Per default produce un commit "vero merge" con due parent, preservando la topologia di entrambe le storie. Se il branch target è un antenato stretto della sorgente, Git fa fast-forward semplicemente spostando il puntatore del branch; passa --no-ff per registrare sempre un merge commit.
Quando le stesse righe sono modificate su entrambi i lati, Git si ferma con un marker di conflitto. Risolvi manualmente, poi git add i file ed esegui git commit (o git merge --continue). Per uscire da un merge in corso, usa git merge --abort.
Nell'uso quotidiano, git merge si integra con alias, editor e CI.
Capire il modello dati di Git aiuta a prevedere i risultati.
Opzioni comuni
| Opzione | Descrizione |
|---|---|
--no-ff | Crea sempre un merge commit, anche quando il fast-forward è possibile. |
--ff-only | Rifiuta di mergiare a meno che il fast-forward non sia possibile. |
--squash | Combina la storia mergiata in un singolo commit sul branch target. |
--abort | Abbandona un merge in corso. |
--continue | Riprende un merge dopo aver risolto i conflitti. |
-s <strategy> | Sceglie la strategia di merge (ort, recursive, resolve, octopus). |
-X <option> | Passa opzione specifica della strategia (es. ours, theirs). |
--no-commit | Mette in stage il risultato del merge ma non committa. |
Esempi
git merge feature/login
# Mergia il feature branch nel branch corrente
git merge --no-ff release/1.2
# Crea sempre un merge commit (preserva la topologia)
git merge --abort
# Cancella un merge dopo che sorgono conflitti
git merge -X theirs hotfix
# Auto-risolve i conflitti preferendo il "loro" lato
Errori comuni
Risolvere conflitti in fretta e dimenticare di rimuovere i marker di conflitto (<<<<<<<) lascia codice rotto committato. Esegui sempre una build o test dopo aver risolto. Un'altra trappola è fare fast-forward silenziosamente quando volevi un merge commit per la tracciabilità — usa --no-ff. Infine, --squash NON crea un merge commit, quindi il branch sorgente non viene registrato come parent.
Comandi correlati
git rebase, git mergetool, git pull, git cherry-pick