Tre strategie, tre storie
Quando si integra un branch di feature in main, ci sono tre opzioni.
Merge commit
git checkout main
git merge --no-ff feature/login
Pro: preserva la verita di come e avvenuto lo sviluppo. Contro: storia non lineare.
Squash and merge
git checkout main
git merge --squash feature/login
git commit -m "Add OAuth login"
Pro: storia lineare. Contro: perde il dettaglio a livello commit.
Rebase and merge
git checkout feature/login
git rebase main
git checkout main
git merge --ff-only feature/login
Pro: lineare; preserva i commit atomici. Contro: richiede disciplina.
Matrice decisionale
- Libreria o progetto kernel-style - rebase and merge.
- App con contributori disciplinati - rebase and merge.
- App con discipline miste - squash.
- Progetto dove i branch paralleli contano - merge commit.
Configurazione sull'host
gh api -X PATCH repos/:owner/:repo \
-F allow_merge_commit=false \
-F allow_squash_merge=true \
-F allow_rebase_merge=true
Equivalenti locali
# Merge commit
git merge --no-ff feature
# Squash
git merge --squash feature && git commit
# Rebase and FF
git rebase main feature
git checkout main
git merge --ff-only feature
Reverting
- Merge commit:
git revert -m 1 <merge-sha>. - Squash:
git revert <squash-sha>. - Rebase:
git revert <sha1> <sha2>....