modulo 06 / lezione 28
Workflow di team
GitFlow e release branch: quando ha ancora senso
Conoscere GitFlow per riconoscerlo nei progetti che lo usano e valutare se è ancora la scelta giusta.
GitFlow e release branch: quando ha ancora senso
GitFlow organizza la storia con branch a ruolo: main, develop, feature/*, release/*, hotfix/*. È più strutturato di GitHub Flow e trunk-based.
Non è morto, ma non è il default giusto per ogni progetto. Ha senso quando il ciclo di release richiede separare sviluppo, stabilizzazione e hotfix.
Perché questa lezione conta
Molti team usano GitFlow perché “si è sempre fatto così”, anche su prodotti web che rilasciano più volte al giorno. Altri lo scartano senza capire perché alcuni prodotti ne hanno ancora bisogno.
La competenza reale è riconoscere il contesto.
Obiettivo operativo
Alla fine della lezione devi saper descrivere GitFlow, disegnare un ciclo release/hotfix e decidere se è adatto al tuo progetto.
Branch principali
main -> codice rilasciato
develop -> integrazione sviluppo
feature/* -> lavoro singolo
release/* -> stabilizzazione versione
hotfix/* -> correzione urgente da main
Flusso tipico:
feature -> develop -> release -> main
\-> tag
hotfix -> main -> develop
Quando ha senso
GitFlow può avere senso per:
- librerie versionate;
- app desktop/mobile con review store;
- software installato presso clienti;
- prodotti con supporto a versioni vecchie;
- release pianificate e stabilizzazione;
- hotfix su versioni già rilasciate.
Qui release/1.4 è utile: congela la versione, accetta solo fix, prepara changelog e tag.
Costo operativo
GitFlow richiede disciplina continua: branch mantenuti, merge back, tag coerenti, changelog, hotfix doppi e comunicazione sulle release. Questo costo è giustificato solo se riduce un rischio reale.
La domanda pratica non è “GitFlow è moderno?”. La domanda è: il nostro prodotto ha bisogno di stabilizzare una versione mentre lo sviluppo successivo continua altrove? Se la risposta è no, GitFlow probabilmente sta pagando complessità senza restituire controllo.
Quando è overkill
È spesso eccessivo per:
- SaaS a deploy continuo;
- siti web piccoli;
- team di 1-5 persone;
- progetti con un solo ambiente;
- codice rilasciato sempre da
main; - team che non mantengono versioni vecchie.
In questi casi aggiunge branch, merge e ritardi senza vero beneficio.
Release branch
Esempio:
git switch develop
git switch -c release/1.4
# fix di stabilizzazione
git switch main
git merge --no-ff release/1.4
git tag -a v1.4.0 -m "Release 1.4.0"
git switch develop
git merge --no-ff release/1.4
Il merge verso develop riporta i fix fatti durante stabilizzazione.
Hotfix
git switch main
git switch -c hotfix/1.4.1-login
# fix
git switch main
git merge --no-ff hotfix/1.4.1-login
git tag -a v1.4.1 -m "Hotfix 1.4.1"
git switch develop
git merge --no-ff hotfix/1.4.1-login
Il fix deve arrivare sia nella versione rilasciata sia nello sviluppo futuro.
Laboratorio guidato
Disegna un rilascio:
- due feature su
develop; - creazione
release/1.0; - fix su release;
- merge in
maine tag; - merge back in
develop; - hotfix da
main; - merge hotfix in
mainedevelop.
Poi rispondi: questo processo è necessario nel tuo progetto o basterebbe GitHub Flow?
Output atteso
Una decisione:
Workflow scelto:
Motivo:
Branch principali:
Quando aprire release branch:
Quando aprire hotfix:
Quando taggare:
Errori comuni
Usare GitFlow senza release reali. Aggiunge complessità inutile.
Dimenticare merge back. Fix su release/hotfix devono tornare nello sviluppo.
Tenere develop instabile per sempre. Allora la stabilizzazione diventa lunga e dolorosa.
Confondere release branch con branch feature lungo. Hanno scopi diversi.
Checklist di verifica
- so spiegare ruolo di main e develop;
- so disegnare release e hotfix;
- so quando taggare;
- so quando GitFlow è overkill;
- il team ha criteri per aprire release branch.
Esercizi
Base · facile
Elenca i branch principali di GitFlow e il loro scopo.
Soluzione
main → solo release stabili (taggate)
develop → integrazione del lavoro in corso
feature/* → singole funzionalità (partono da develop)
release/* → stabilizzazione di una versione prima del rilascio
hotfix/* → correzioni urgenti su una release in produzione
GitFlow assegna a ogni tipo di lavoro un branch dedicato. È più strutturato (e più pesante) dei flussi a singolo trunk.
Intermedio · medio
Descrivi il percorso di una feature e di un hotfix in GitFlow. Spiega perché l’hotfix non passa da develop.
Soluzione
# Feature
git switch -c feature/x develop # nasce da develop
# ...poi merge in develop
# Hotfix
git switch -c hotfix/1.2.1 main # nasce da main (la produzione)
# fix → merge in main (tag 1.2.1) E in develop
La feature vive nel ciclo di sviluppo (develop). L’hotfix nasce da main perché deve correggere ciò che è in produzione adesso, senza trascinarsi dentro il lavoro non ancora rilasciato di develop. Va poi riportato anche in develop perché il fix non vada perso nella prossima release.
Sfida · difficile
Spiega perché GitFlow è caduto in disuso per molte web app e in quali contesti resta giustificato.
Soluzione
Contro (web app moderne):
- molti branch long-lived → divergenza, merge complessi
- attrito con il deploy continuo (develop vs main rallenta)
Resta sensato quando:
- esistono più versioni supportate contemporaneamente (es. v1.x e v2.x)
- i rilasci sono pianificati e versionati (software distribuito, on-premise)
- serve una fase formale di stabilizzazione/QA per release
Per un SaaS con un’unica versione live e deploy continuo, GitFlow aggiunge branch e merge che rallentano senza dare valore: GitHub Flow o trunk-based sono più adatti. GitFlow torna utile dove la realtà è davvero multi-versione e a rilasci scaglionati, e dove la sua struttura riflette un processo che esiste comunque.
Collegamenti
- Modulo: Workflow di team — lezione 28 del corso.
- Tag e SemVer completano il discorso release.