Release Branch in Git — cos'è, scopo e flusso di lavoro

Autore: IT Sectr Pubblicato: 2026-05-10 Tempo di lettura: 9 min

Release Branch è un ramo in Git Flow creato da develop per preparare un rilascio specifico alla distribuzione. In esso viene fissata la versione dell'applicazione, vengono corretti gli ultimi bug e aggiornati i metadati, senza aggiungere nuove funzionalità. Secondo Vincent Driessen, 2010, il ramo release separa la preparazione del rilascio dallo sviluppo corrente, consentendo a entrambe le attività di procedere in parallelo.

Punti chiave

  • Release Branch — un ramo temporaneo per la preparazione del rilascio: fissaggio della versione, correzioni di bug e metadati.
  • Isolamento del rilascio consente di preparare un nuovo rilascio e continuare lo sviluppo delle funzionalità successive in develop simultaneamente.
  • Divieto di nuove funzionalità — nel ramo release vengono aggiunte solo correzioni e documentazione, nessun nuovo codice.
  • Doppia unione — dopo il completamento, il ramo release viene unito in main (rilascio) e di nuovo in develop (correzioni di bug).
  • Denominazione — formato standard release/X.Y.Z secondo la versione dell'applicazione.

Cos'è un Release Branch in Git

Release Branch (ramo di rilascio) è un ramo temporaneo in Git Flow, creato da develop quando il team decide che l'insieme corrente di funzionalità è pronto per il rilascio. Esiste esattamente per il tempo necessario alla preparazione finale del rilascio, da poche ore a qualche giorno.

Lo scopo principale di un ramo release è congelare un insieme specifico di funzionalità per il rilascio senza fermare lo sviluppo delle versioni successive. Mentre il ramo release viene preparato per la distribuzione, altri sviluppatori possono continuare a unire rami feature in develop per il prossimo rilascio.

Nel ramo release non vengono create nuove funzionalità, solo correzioni di bug, aggiornamento della versione dell'applicazione, localizzazione e documentazione. Dopo aver completato tutto il lavoro, il ramo release viene unito in main (marcato come rilascio) e di nuovo in develop (in modo che le correzioni arrivino alle versioni future).

Secondo Atlassian, 2024, i rami release sono di fondamentale importanza per i progetti con cicli di rilascio regolari, poiché garantiscono prevedibilità e stabilità del processo di pubblicazione.

Ciclo di vita del ramo release

Il ciclo di vita del ramo release, dalla creazione all'eliminazione, comprende diverse fasi. Comprendere ogni fase aiuta il team a sincronizzare le azioni ed evitare errori.

  1. Creazione — dall'ultimo commit di develop viene creato un ramo chiamato release/2.5.0. develop continua ad accettare rami feature per la versione successiva.
  2. Preparazione — nel ramo release, la versione dell'applicazione viene aggiornata in build.gradle, Info.plist e altri file di configurazione.
  3. Correzione bug — gli errori critici trovati durante i test finali vengono corretti. Solo bug, senza nuove funzionalità.
  4. Test finali — il team QA esegue test di regressione sul ramo release. I nuovi bug vengono inviati per la correzione nello stesso ramo.
  5. Unione in main — il ramo release viene unito in main con il flag --no-ff. Viene creato il tag di rilascio: v2.5.0.
  6. Unione in develop — il ramo release viene riunito in develop in modo che le correzioni del rilascio arrivino allo sviluppo corrente.
  7. Eliminazione — il ramo release viene eliminato localmente e da remoto, poiché il suo compito è completato.

Il passo 6 — l'unione inversa in develop — viene spesso dimenticato, ma è di fondamentale importanza. Senza di esso, le correzioni apportate nel ramo release non raggiungeranno develop e gli stessi errori potrebbero ripresentarsi nel prossimo rilascio.

Durata tipica delle fasi del ramo release

La durata di vita del ramo release dipende dalla complessità del rilascio e dalla qualità del codice in develop. In media, la preparazione richiede da 2 a 5 giorni lavorativi per un'applicazione mobile di medie dimensioni.

Cosa si fa nel ramo release

Nel ramo release viene eseguito un insieme strettamente limitato di attività. Qualsiasi deviazione da questo elenco viola il modello Git Flow e crea rischi per la stabilità del rilascio.

Tipo di modificaConsentitoEsempio
VersionamentoAggiornamento di versionName in build.gradle
Correzioni di bugCorrezione di crash all'avvio
LocalizzazioneAggiunta di traduzioni per nuovi schermi
DocumentazioneAggiornamento di CHANGELOG e README
Nuove funzionalitàNoAggiunta di un nuovo schermo profilo
RefactoringNoRiscrittura del livello di rete
Aggiornamento librerieCon cautelaSolo versioni patch per correzioni

La regola del divieto di nuove funzionalità è la più importante nel ramo release. Se una funzionalità non è pronta per il rilascio, aspetta il ciclo successivo. Tentare di introdurre una funzionalità incompleta nel ramo release è la causa principale di superamento delle scadenze e bug in produzione.

Aggiornamento della versione in un progetto mobile

Nel ramo release, il numero di versione dell'applicazione viene obbligatoriamente aggiornato. Per Android, questi sono i campi versionCode e versionName in build.gradle; per iOS — CFBundleShortVersionString in Info.plist.

groovy
// build.gradle (a livello di app) — aggiornamento versione nel ramo release
android {
    defaultConfig {
        versionCode 42
        versionName "2.5.0"
    }
}

// Per iOS — aggiornamento di Info.plist
// CFBundleShortVersionString = 2.5.0
// CFBundleVersion = 42

Differenze tra release e hotfix

Gli sviluppatori principianti spesso confondono i rami release e hotfix, sebbene i loro scopi siano fondamentalmente diversi. Scegliere il tipo di ramo sbagliato può ritardare una correzione critica o interrompere il processo di rilascio.

  • Origine — release viene creato da develop, hotfix da main. Questa è la differenza principale che determina tutto il resto.
  • Urgenza — release è pianificato: il team decide quando iniziare la preparazione. Hotfix è urgente: un problema in produzione richiede una correzione immediata.
  • Contenuto — release può includere più correzioni e aggiornamento di versione. Hotfix contiene una sola correzione critica.
  • Unione — release viene unito in main e develop. Hotfix viene anch'esso unito in main e develop, ma con priorità.
  • Durata — release vive da 1 a 7 giorni. Hotfix vive da 30 minuti a 1 giorno.

Se un bug viene trovato durante la preparazione del rilascio (nel ramo release), è una correzione normale. Se un bug viene trovato in produzione (su main), è un hotfix e viene creato da main, anche se il ramo release esiste già.

Regole di denominazione dei rami release

Uno standard unificato di denominazione dei rami release semplifica la navigazione del repository e consente ai sistemi CI/CD di rilevare automaticamente che un ramo appartiene al processo di rilascio.

  • release/X.Y.Z — formato standard Git Flow, dove X.Y.Z è la versione del rilascio. Esempio: release/2.5.0.
  • release/nome — formato alternativo con un nome in codice del rilascio. Esempio: release/merlin.
  • release/data — formato con la data di rilascio. Usato raramente poiché la versione è più importante della data. Esempio: release/2024-12-01.

Il formato release/X.Y.Z è preferito perché lega esplicitamente il ramo al numero di versione che verrà assegnato al rilascio. Ciò semplifica la ricerca e l'elaborazione automatica tramite script CI/CD.

Strategia di unione inversa in develop

L'unione inversa (merge back) del ramo release in develop è una delle operazioni più importanti e allo stesso tempo più spesso trascurate. Senza di essa, tutte le correzioni apportate nel ramo release rimangono solo nella versione di rilascio e non raggiungono il successivo ciclo di rilascio.

Il processo di unione inversa viene eseguito dopo che il ramo release è già stato unito in main. Prima, release viene unito in develop, poi eliminato. Ciò garantisce che develop contenga tutte le correzioni apportate durante la preparazione del rilascio.

Dopo l'unione inversa, possono verificarsi conflitti, specialmente se in develop sono già comparsi nuovi rami feature che hanno modificato gli stessi file. Lo sviluppatore responsabile del rilascio risolve questi conflitti e invia develop al server.

Alcuni team usano rebase invece di merge per l'unione inversa per mantenere una cronologia lineare. Tuttavia, merge è più sicuro per develop perché non riscrive la cronologia dei commit che potrebbe già essere utilizzata da altri sviluppatori.

Esempi di comandi per lavorare con release

Esaminiamo il ciclo completo di lavoro con un ramo release: dalla creazione all'eliminazione dopo un rilascio riuscito di un'applicazione mobile versione 2.5.0.

bash
# 1. Creare ramo release da develop
git checkout develop
git pull origin develop
git checkout -b release/2.5.0

# 2. Aggiornare versione e correzioni
git add build.gradle
git commit -m "Bump version to 2.5.0"

# 3. Correggere bug (solo bugfixes)
git add src/fix/
git commit -m "Fix crash on payment screen"

# 4. Inviare ramo release al server
git push origin release/2.5.0

# 5. Unire release in main
git checkout main
git pull origin main
git merge --no-ff release/2.5.0
git tag -a v2.5.0 -m "Release 2.5.0"
git push origin main --tags

# 6. Unione inversa in develop
git checkout develop
git merge --no-ff release/2.5.0
git push origin develop

# 7. Eliminare ramo release
git branch -d release/2.5.0
git push origin --delete release/2.5.0

I comandi 5 e 6 — la doppia unione — sono di fondamentale importanza. Prima, main riceve il codice di rilascio e il tag, poi develop si sincronizza con le correzioni di release. Se il passo 6 viene saltato, le correzioni del rilascio non raggiungeranno il prossimo ciclo di sviluppo.

Automazione del processo di rilascio

Per i progetti mobile con rilasci regolari, il processo di creazione di un ramo release e aggiornamento della versione può essere automatizzato tramite script CI/CD. GitHub Actions consente di creare un flusso di lavoro che, alla pressione di un pulsante, crea un ramo release con aggiornamento automatico della versione.

Per i progetti mobile con rilasci regolari, il processo di creazione di un ramo release e aggiornamento della versione può essere automatizzato tramite script CI/CD. GitHub Actions consente di creare un flusso di lavoro che, alla pressione di un pulsante, crea un ramo release con aggiornamento automatico della versione.

yaml
# GitHub Actions — automazione della creazione del ramo release
name: Create Release Branch

on:
  workflow_dispatch:
    inputs:
      version:
        description: 'Release version (e.g. 2.5.0)'
        required: true

jobs:
  create-release:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Create release branch
        run: |
          git checkout develop
          git checkout -b release/${{ inputs.version }}
          git push origin release/${{ inputs.version }}

Domande frequenti

Quanti rami release possono esistere contemporaneamente?

Un solo ramo release alla volta, se si segue Git Flow. Avere due rami release attivi significa che il team sta cercando di pubblicare due versioni in parallelo, violando il principio dei rilasci sequenziali e creando confusione con le versioni.

Cosa fare se il ramo release contiene una funzionalità incompleta?

Rimuovi i commit della funzionalità incompleta dal ramo release tramite git revert e posticipa la funzionalità al prossimo rilascio. Non pubblicare mai funzionalità incomplete in produzione: il debito tecnico e i potenziali bug non valgono la fretta.

Si può saltare la creazione di un ramo release?

Per rilasci semplici con una singola correzione, il ramo release può essere saltato e unito direttamente da develop a main. Tuttavia, per rilasci standard, il ramo release è obbligatorio: fissa la versione, isola la preparazione e garantisce la doppia unione delle correzioni.

Come annullare un rilascio se main ha già ricevuto l'unione?

Usa git revert su main per creare un nuovo commit che annulli tutte le modifiche del rilascio. Quindi elimina il tag di rilascio con git push origin --delete vX.Y.Z. Dopo aver corretto i problemi, crea un nuovo ramo release con un numero di patch incrementato.

Qual è la differenza tra release candidate e release branch?

Un release candidate (RC) è un artefatto di build che viene sottoposto ai test finali. Un release branch è un ramo Git da cui viene costruito il release candidate. Uno stesso ramo release può generare più build RC (RC1, RC2, ecc.) man mano che i bug vengono corretti.

Riepilogo

  • Release Branch — un ramo temporaneo Git Flow per la preparazione finale del rilascio: versionamento, correzioni di bug e localizzazione senza nuove funzionalità.
  • Isolamento dello sviluppo — il ramo release consente di preparare un rilascio e continuare lo sviluppo delle funzionalità successive in develop simultaneamente.
  • Doppia unione — dopo il completamento, release viene unito in main (tag di rilascio) e di nuovo in develop (sincronizzazione delle correzioni).
  • Divieto di nuove funzionalità — nel ramo release vengono aggiunte solo correzioni e metadati. Le nuove funzionalità vanno al prossimo rilascio.
  • Denominazione — formato standard release/X.Y.Z con numero di versione SemVer.
  • Unione inversa in develop è un passaggio obbligatorio spesso trascurato, ma senza di esso le correzioni del rilascio vengono perse per le versioni future.
  • Raccomandazione: automatizza la creazione del ramo release e l'aggiornamento della versione tramite CI/CD e rendi la doppia unione un elemento obbligatorio nella checklist di rilascio.

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche