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.

60 minGit e controllo versione

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:

  1. librerie versionate;
  2. app desktop/mobile con review store;
  3. software installato presso clienti;
  4. prodotti con supporto a versioni vecchie;
  5. release pianificate e stabilizzazione;
  6. 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:

  1. SaaS a deploy continuo;
  2. siti web piccoli;
  3. team di 1-5 persone;
  4. progetti con un solo ambiente;
  5. codice rilasciato sempre da main;
  6. 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:

  1. due feature su develop;
  2. creazione release/1.0;
  3. fix su release;
  4. merge in main e tag;
  5. merge back in develop;
  6. hotfix da main;
  7. merge hotfix in main e develop.

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.