modulo 03 / lezione 15
Branch e merge
Strategie di branching: short-lived vs long-lived
Scegliere durata e numero di branch in funzione di team, ritmo di rilascio e tipo di prodotto.
Strategie di branching: short-lived vs long-lived
Un branch è economico da creare, ma non è gratuito da mantenere. Più vive, più diverge. Più diverge, più costoso diventa integrarlo.
La strategia di branching non è una religione: dipende da prodotto, team, ciclo di rilascio, test automatici e tolleranza al rischio.
Perché questa lezione conta
Branch vecchi sono una forma di debito tecnico. Nascondono lavoro non integrato, accumulano conflitti, rendono i test meno significativi e creano sorprese al merge.
Allo stesso tempo, alcuni prodotti hanno bisogno di release branch o supporto a più versioni. L’obiettivo è scegliere consapevolmente, non ripetere una ricetta.
Obiettivo operativo
Alla fine della lezione devi saper valutare quando usare branch short-lived, quando accettare branch long-lived e quali pratiche riducono il costo della divergenza.
Branch short-lived
Durano ore o pochi giorni. Tipici di trunk-based development e GitHub Flow leggero.
Vantaggi:
- conflitti piccoli;
- feedback rapido da CI;
- review più semplice;
- minor distanza da
main; - meno lavoro nascosto.
Richiedono:
- test automatici;
- feature flag per codice non ancora attivo;
- PR piccole;
- capacità di spezzare lavoro grande.
Branch long-lived
Durano settimane o mesi. Possono avere senso per:
- release branch di prodotto versionato;
- supporto a clienti su versioni diverse;
- migrazioni lunghe isolate;
- sviluppo sperimentale non pronto.
Costi:
- conflitti grandi;
- integrazione dolorosa;
- CI meno rappresentativa;
- rischio “funziona sul mio branch”;
- review enorme alla fine.
Se un branch deve vivere a lungo, va trattato come un progetto: sincronizzazioni pianificate, owner, criteri di merge, test regolari.
Misurare età e stato
Comandi utili:
git branch --sort=-committerdate
git branch -vv
git for-each-ref --sort=-committerdate refs/heads/ --format='%(committerdate:short) %(refname:short)'
Per branch remoti:
git fetch --prune
git branch -r --sort=-committerdate
Non basta sapere quanti branch ci sono. Serve sapere quali sono vivi, quali integrati, quali abbandonati.
Costo della divergenza
Un branch diverge quando main continua a muoversi e il branch resta indietro.
Riduci il costo con:
- rebase o merge frequente da
main; - PR piccole;
- feature flag;
- commit atomici;
- eliminazione branch dopo merge;
- ownership chiara.
Il problema non è il branch. È il branch senza ciclo di vita.
Policy di team
Esempio:
Feature branch: massimo 2-3 giorni.
Spike: massimo 1 settimana, poi decisione.
Release branch: owner e data di chiusura.
Branch remoti mergiati: cancellati entro 24h.
Branch stale > 14 giorni: review settimanale.
Una policy semplice evita accumulo silenzioso.
Laboratorio guidato
Nel tuo repo:
- esegui fetch con prune;
- lista branch locali e remoti per data;
- classifica: attivo, mergiato, abbandonato, release, spike;
- cancella branch locali sicuri;
- proponi cancellazione remota dove serve;
- scrivi una regola di durata per il team.
Non cancellare branch remoti condivisi senza accordo.
Output atteso
Una tabella:
branch | owner | età | stato | azione
e una policy di branching di massimo 10 righe.
Errori comuni
Confondere branch vecchio con branch importante. Se è importante, deve avere owner e piano.
Integrare solo alla fine. Rende i conflitti più costosi.
Tenere branch remoti mergiati. Sporcono la vista e confondono.
Usare long-lived per paura del rilascio. Spesso servono feature flag o test, non branch eterni.
Checklist di verifica
- so misurare età dei branch;
- so distinguere branch attivo, stale e release;
- so cancellare branch locali sicuri;
- il team ha una durata attesa per feature branch;
- i branch lunghi hanno owner e motivazione.
Collegamenti
- Modulo: Branch e merge — lezione 15 del corso.
- I workflow del modulo 6 formalizzano queste scelte a livello di team.