Flusso di lavoro di Gitflow
Gitflow รจ un flusso di lavoro Git legacy che in origine ha rappresentato una strategia innovativa e dirompente di gestione dei branch Git. La popolaritร di Gitflow รจ diminuita a favore dei flussi di lavoro basati su trunk, che ora sono considerati come best practice dello sviluppo continuo di software moderno, eย delle pratiche DevOps. Inoltre, Gitflow puรฒ essere difficile da usare con CI/CD. Questo post descrive nei dettagli la storia di Gitflow.
Che cos'รจ Gitflow?
Gitflow รจ un modello di branching Git alternativo che prevede l'uso di feature branch e di piรน branch primari. ร stato pubblicato per la prima volta e reso popolare da Vincent Driessen su nvie. Rispetto allo sviluppo basato su trunk, Gitflow ha numerosi branch di piรน lunga durata e commit di maggiori dimensioni. Con questo modello, gli sviluppatori creano un branch di funzioni e ne posticipano il merge nel branch principale del trunk fino a quando la funzione non รจ completata. Questi feature branch di lunga durata richiedono una maggiore collaborazione per il merge e presentano un maggiore rischio di allontanarsi dal branch del trunk. Possono inoltre introdurre aggiornamenti in conflitto.
Gitflow puรฒ essere utilizzato per progetti con un ciclo di rilascio pianificato e per le best practice DevOps diย continuous delivery.ย Questo flusso di lavoro non aggiunge nuovi concetti o comandi oltre a quanto richiesto per ilย flusso di lavoro del branch di funzioni.ย Assegna invece ruoli molto specifici ai diversi branch e definisce modi e tempi della loro interazione. Oltre ai branch feature, utilizza singoli branch per la preparazione, la gestione e la registrazione dei rilasci. Naturalmente, puoi sfruttare anche tutti i vantaggi del flusso di lavoro dei branch di funzioni: pull request, esperimenti isolati e collaborazione piรน efficiente.
Come funziona
Branch di sviluppo e branch principale
Invece di un singolo branch main,ย questo flusso di lavoro utilizza due branch per registrare la cronologia del progetto. Il branch mainย memorizza la cronologia di rilascio ufficiale e il branch develop funge da branch di integrazione per le funzioni. ร inoltre molto pratico taggare tutti i commit nel branch mainย con un numero di versione.
Il primo passo consiste nell'integrare il branch mainย predefinito con un branch develop. Per procedere in modo semplice, uno sviluppatore deve creare un branch develop vuoto in locale ed eseguirne il push sul server:
git branch develop
git push -u origin developQuesto branch conterrร la cronologia completa del progetto, mentre il branch mainย ne conterrร una versione ridotta. Gli altri sviluppatori devono ora clonare il repository centrale e creare un branch di traccia per il branch develop.
Quando si utilizza la libreria di estensioni git-flow, l'esecuzione di git flow init su un repository esistente creerร il branch develop:
$ git flow init
Initialized empty Git repository in ~/project/.git/
No branches exist yet. Base branches must be created now.
Branch name for production releases: [main]
Branch name for "next release" development: [develop]
How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
$ git branch
* develop
mainBranch di funzioni
Passaggio 1. Creazione del repository
Ogni nuova funzione deve risiedere nel proprio branch, di cui puรฒ essere eseguito il push al repository centraleย a fini di backup/collaborazione. Ma, invece di diramarsi dal branch main, i branch feature usano il branch develop come branch principale. Quando una funzione รจ completa, ne viene eseguito nuovamente il merge nel branch develop.ย Le funzioni non devono mai interagire direttamente con il branch main.
Nota che i branch feature uniti con il branch develop costituiscono a tutti gli effetti il flusso di lavoro del branch di funzioni. Tuttavia, il flusso di lavoro di Gitflow non si ferma qui.
I branch feature vengono generalmente creati a partire dal branch develop piรน recente.
Creazione di un branch di funzioni
Senza le estensioni git-flow:
git checkout develop
git checkout -b feature_branchSe si utilizza l'estensione git-flow:
git flow feature start feature_branchContinua a lavorare utilizzando Git come faresti normalmente.
Completamento di un branch di funzioni
Quando hai terminato il lavoro di sviluppo della funzione, il passo successivo รจ quello di eseguire il merge di feature_branch in develop.
Senza le estensioni git-flow:
git checkout develop
git merge feature_branchCon le estensioni git-flow:
git flow feature finish feature_branchBranch di rilascio
Una volta che develop ha acquisito un numero sufficiente di funzioni per effettuare un rilascio (o si sta avvicinando una data di rilascio prestabilita), esegui un fork di un branch release da develop. La creazione di questo branch avvia il ciclo di rilascio successivo, pertanto non รจ possibile aggiungere nuove funzioni dopo questo punto: devono essere inseriti in questo branch solo correzioni di bug, la creazione di documentazione e altri task orientati al rilascio. Quando รจ tutto pronto per il rilascio, viene eseguito il merge del branch release in mainย e il branch viene contrassegnato con un numero di versione. Inoltre, dovrebbe esserne eseguito nuovamente il merge in develop, che nel frattempo potrebbe essere avanzato dall'inizio del rilascio.
L'utilizzo di un branch dedicato per preparare i rilasci consente a un team di perfezionare il rilascio corrente mentre un altro team continua a lavorare sulle funzioni per il prossimo rilascio. Crea anche fasi di sviluppo ben definite (ad esempio, diventa facile programmare la preparazione alla versione 4.0 per la settimana in corso e vedere effettivamente tale versione nella struttura del repository).
Creare branch release รจ un'altra semplice operazione di creazione di branch. Come i branch feature, quelli release si basano sul branch develop. ร possibile creare un nuovo branch release utilizzando i seguenti metodi.
Senza le estensioni git-flow:
git checkout develop
git checkout -b release/0.1.0Se si utilizzano le estensioni git-flow:
$ git flow release start 0.1.0
Switched to a new branch 'release/0.1.0'Una volta che il rilascio รจ pronto, ne verrร eseguito il merge in mainย e develop, quindi il branch release verrร eliminato. ร importante eseguire nuovamente il merge in develop perchรฉ potrebbero essere stati aggiunti aggiornamenti critici al branch release che devono essere accessibili alle nuove funzioni. Se la tua organizzazione dร molta importanza alla revisione del codice, questo รจ il luogo ideale per eseguire una pull request.
Per completare un branch release, utilizza i seguenti metodi:
Senza le estensioni git-flow:
git checkout main
git merge release/0.1.0Oppure con l'estensione git-flow:
git flow release finish '0.1.0'Branch di correzione rapida
I branch di manutenzione, o "hotfix", vengono utilizzati per applicare rapidamente patch ai rilasci di produzione. I branch hotfix sono molto simili ai branch release e feature, tranne per il fatto che sono basati sul branch main anzichรฉ sul branch develop. Sono gli unici branch che dovrebbero eseguire un fork direttamente dal branch main. Non appena la correzione รจ completa, ne dovrebbe essere eseguito il merge sia in mainย che in develop (o nel branch release corrente) e al branch mainย dovrebbe essere aggiunto un tag con un numero di versione aggiornato.
Avere una linea di sviluppo dedicata per le correzioni dei bug consente al team di gestire i ticket senza interrompere il resto del flusso di lavoro o attendere il prossimo ciclo di rilascio. Puoi immaginare i branch di manutenzione come branch release ad hoc che funzionano direttamente con il branch main. ร possibile creare un branch hotfix utilizzando i seguenti metodi:
Senza le estensioni git-flow:
git checkout main
git checkout -b hotfix_branchSe si utilizzano le estensioni git-flow:
$ git flow hotfix start hotfix_branchCome accade per il completamento di un branch release, viene eseguito il merge del branch hotfix sia nel branch mainย che nel branch develop.
git checkout main
git merge hotfix_branch
git checkout develop
git merge hotfix_branch
git branch -D hotfix_branch$ git flow hotfix finish hotfix_branchEsempio
Di seguito รจ riportato un esempio completo del flusso di un branch di funzioni in cui si parte dal presupposto che il repository sia stato configurato con un branchย main.
git checkout main
git checkout -b develop
git checkout -b feature_branch
# work happens on feature branch
git checkout develop
git merge feature_branch
git checkout main
git merge develop
git branch -d feature_branchOltre al flusso dei branch feature e release, un esempio del branch hotfix รจ il seguente:
git checkout main
git checkout -b hotfix_branch
# work is done commits are added to the hotfix_branch
git checkout develop
git merge hotfix_branch
git checkout main
git merge hotfix_branchRiepilogo
Qui abbiamo parlato del flusso di lavoro di Gitflow. Gitflow รจ uno dei tanti stili diย flussi di lavoro Gitย che tu e il tuo team potete utilizzare.
Alcuni concetti chiave da conoscere su Gitflow sono:
Questo flusso di lavoro รจ ottimo per un flusso di lavoro software basato sul rilascio.
Gitflow offre un canale dedicato per le correzioni rapide nell'ambiente di produzione.
Il flusso generale di Gitflow รจ:
Un branch
developviene creato a partire dal branchmainUn branch
releaseviene creato a partire dal branchdevelopI branch
featureย vengono creati a partire dal branchdevelopQuando un branch
featureรจ completo, ne viene eseguito il merge nel branchยdevelopQuando il branch
releaseรจ completo, ne viene eseguito il merge nei branchdevelopemainSe viene rilevato un problema nel branch
main,ย viene creato un branchhotfixa partire dal branchmainUna volta completato il branch
hotfix, ne viene eseguito il merge sia nel branchdevelopche nel branchmain
Scopri di piรน sul flusso di lavoro di forkย o visita la nostraย pagina di confronto dei flussi di lavoro.