modulo 03 / lezione 11
Branch e merge
Creare e cambiare branch: switch, checkout, branch
Usare i branch come spazi di lavoro economici e reversibili, non come strutture pesanti.
Creare e cambiare branch: switch, checkout, branch
Un branch è un puntatore mobile a un commit. Crearene uno costa pochissimo. Non duplica il progetto, non crea una copia pesante: dà un nome a una linea di lavoro.
Questa idea rende i branch meno intimidatori. Puoi usarli per feature, fix, esperimenti, spike tecnici e prove da buttare. La cosa importante è dare loro una vita breve e uno scopo chiaro.
Perché questa lezione conta
Chi ha paura dei branch tende a lavorare direttamente su main o a mischiare modifiche non correlate. Chi li usa senza disciplina lascia branch vecchi, divergenti e difficili da integrare.
Il punto non è creare molti branch. È creare branch al momento giusto, da una base corretta, con un nome comprensibile e una fine prevista.
Obiettivo operativo
Alla fine della lezione devi saper creare, cambiare, rinominare e cancellare branch locali, distinguere switch, checkout e branch, e scegliere nomi utili al team.
switch, checkout, branch
Comandi moderni:
git switch main
git switch -c feat/login
switch serve a cambiare branch. Con -c crea e cambia.
Comando storico:
git checkout -b feat/login
Funziona ancora, ma checkout fa troppe cose: cambia branch, ripristina file, entra in detached HEAD. switch è più chiaro per i branch.
Per creare senza cambiare:
git branch feat/login
Per vedere branch:
git branch
git branch -vv
-vv mostra anche upstream e stato rispetto al remoto.
Creare da una base corretta
Prima di aprire un branch:
git switch main
git fetch origin
git status -sb
Poi integra la base secondo il workflow del team:
git pull --ff-only
oppure fetch + rebase/merge consapevole. Aprire branch da una base vecchia significa importare conflitti già evitabili.
Naming
Nomi utili:
feat/login-magic-link
fix/checkout-doppio-submit
chore/aggiorna-dipendenze
docs/readme-deploy
spike/prova-cache-redis
Nomi deboli:
carlo
test
nuovo
fix
finale
Un branch name dovrebbe dire intento e, se utile, collegarsi a ticket o area.
Branch locali e remoti
Un branch locale non esiste automaticamente sul remoto. Per pubblicarlo:
git push -u origin feat/login-magic-link
-u imposta upstream. Da quel momento git push e git pull sanno quale branch remoto usare.
Eliminare branch locale:
git branch -d feat/login-magic-link
-d rifiuta se il branch non è stato integrato. -D forza: usalo solo se sai che stai buttando via lavoro.
Eliminare branch remoto:
git push origin -d feat/login-magic-link
Quando aprire un branch
Apri un branch quando:
- il lavoro non è banale;
- vuoi aprire una PR;
- devi sperimentare;
- devi isolare un fix;
- il team protegge
main.
Non serve branch per ogni micro-correzione locale, se il workflow è individuale e il commit è diretto. Ma in team, branch + PR è spesso il confine naturale di review.
Laboratorio guidato
In un repo demo:
- crea
feat/a,fix/b,spike/cdallo stesso commit; - fai un commit diverso su ciascuno;
- torna a
maine osserva che non contiene quei commit; - usa
git log --graph --oneline --decorate --all; - cancella il branch sperimentale dopo aver deciso di buttarlo.
Disegna il grafo prima e dopo.
Output atteso
Una convenzione di naming di team:
feat/<area>-<descrizione>
fix/<area>-<bug>
chore/<operazione>
docs/<argomento>
spike/<ipotesi>
e una regola: ogni branch deve avere scopo, owner e fine prevista.
Errori comuni
Aprire branch da base vecchia. Genera conflitti evitabili.
Tenere branch personali per settimane. Più vive, più diverge.
Usare nomi opachi. Il branch deve essere leggibile in una lista remota.
Forzare cancellazione senza controllare. git branch -D può eliminare l’unico riferimento a commit non integrati.
Checklist di verifica
- so creare branch con
git switch -c; - so leggere
git branch -vv; - so pubblicare con upstream;
- so cancellare branch locale e remoto;
- so distinguere branch di feature, fix e spike.
Collegamenti
- Modulo: Branch e merge — lezione 11 del corso.
- La prossima lezione spiega come integrare branch con merge.