Un modello di branching per Git che funziona – 30/04/2013
Git Flow
PUG Marche
2
Contenuti
•
•
•
•
Flusso completo
Branch principali
Branch di supporto
Esperienze, strumenti e riferimenti
3
Il modello di git-flow
E’ una strategia di branching e release management
Idoneo per sviluppo concorrente di più feature
Supporta lo sviluppo in pair programming
Idoneo per la continuous integration
E’ ottimo per il continuous deployment e consente di applicare velocemente bug fix (“hot fix”)
Caratteristiche e benefici
4
Flusso di sviluppo e di hot fix
Feature br. Develop Release br. Master
Master Hot fix
Master
Develop
Sviluppo
Hot fix in produzione
5
Pair programming e team per funzionalità
6
Sintesi dei branch
Master: produzione
Develop: integrazione
Hotfixes: applicazione di bug fix in produzione
Release: release candidate
Feature branches: branch dedicati agli sviluppi di singole feature
Elenco dei branch
7
Contenuti
•
•
•
•
Flusso completo
Branch principali
Branch di supporto
Esperienze, strumenti e riferimenti
8
I branch principali: master e develop
• origin e master non vengono mai eliminati: esistono in qualsiasi momento del progetto
• Gli altri branch sono solo temporanei
• origin/master è il branch principale per il codice production-ready
• origin/develop è il branch principale per gli sviluppi (è anche il branch di riferimento per la continuous integration)
• Quando il codice in develop è stabile a sufficienza viene effettuato il merge su master e viene impostato il tag della release
Descrizione e flusso di base
9
Contenuti
•
•
•
•
Flusso completo
Branch principali
Branch di supporto
Esperienze, strumenti e riferimenti
10
Branch delle feature
Utilizzato per sviluppi a breve o lungo termine.
Ci possono essere più feature branch in parallelo.
Il branch può partire da develop e viene effettuato il merge di ritorno sempre su develop
Può essere chiamato con qualsiasi nome diverso da master, develop, release-* o hotfix-*
Esiste tipicamente solo nel repository dello sviluppatore
Descrizione e flusso
11
Branch delle feature: comandi
Creare un nuovo branch per una feature:
$ git checkout -b myfeature developSwitched to a new branch "myfeature"
Incorporare un branch di una feature su develop:
$ git checkout developSwitched to branch 'develop'$ git merge --no-ff myfeatureUpdating ea1b82a..05e9557(Summary of changes)$ git branch -d myfeatureDeleted branch myfeature (was 05e9557).$ git push origin develop
Differenza con e senza fast forward:
12
Branch delle release
Supportano la preparazione del codice per il rilascio in produzione
A questo punto, tutte le feature che sono considerate pronte per il rilascio devono essere già state riportate su develop
Il branch può partire da develop e viene effettuato il merge di ritorno sempre su master e develop
Convenzione di naming: release-*
Descrizione e flusso
13
Branch delle release: comandi
Creare un nuovo branch per una release:
$ git checkout -b release-1.2 developSwitched to a new branch "release-1.2"$ ./bump-version.sh 1.2Files modified successfully, version bumped to 1.2.$ git commit -a -m "Bumped version number to 1.2"[release-1.2 74d9424] Bumped version number to 1.21 files changed, 1 insertions(+), 1 deletions(-)
Concludere una release:
Merge su master e tag:
$ git checkout masterSwitched to branch 'master'$ git merge --no-ff release-1.2Merge made by recursive.(Summary of changes)$ git tag -a 1.2
Riportare le modifiche su develop:
$ git checkout developSwitched to branch 'develop'$ git merge --no-ff release-1.2Merge made by recursive.(Summary of changes)
Rimuovere la release:
$ git branch -d release-1.2Deleted branch release-1.2 (was ff452fe).
14
Branch degli hot fix
Serve per correggere bug fix critici in produzione senza attendere che il ramo develop sia pronto per il rilascio.
Il branch può partire da master e viene effettuato il merge di ritorno sempre su master e develop
Convenzione di naming: hotfix-*
Descrizione e flusso
15
Branch degli hot fix: comandi
Creare un nuovo hot fix per effettuare il bug fixing:
$ git checkout -b hotfix-1.2.1 masterSwitched to a new branch "hotfix-1.2.1"$ ./bump-version.sh 1.2.1Files modified successfully, version bumped to 1.2.1.$ git commit -a -m "Bumped version number to 1.2.1"[hotfix-1.2.1 41e61bb] Bumped version number to 1.2.11 files changed, 1 insertions(+), 1 deletions(-)
Merge su master dopo avere effettuato il bug fix:
$ git commit -m "Fixed severe production problem"[hotfix-1.2.1 abbe5d6] Fixed severe production problem5 files changed, 32 insertions(+), 17 deletions(-)
Concludere un hot fix:
Merge su master e tag:
$ git checkout masterSwitched to branch 'master'$ git merge --no-ff hotfix-1.2.1Merge made by recursive.(Summary of changes)$ git tag -a 1.2.1
Riportare il bug fix su develop:
$ git checkout developSwitched to branch 'develop'$ git merge --no-ff hotfix-1.2.1Merge made by recursive.(Summary of changes)
Rimuovere l’hot fix:
$ git branch -d hotfix-1.2.1Deleted branch hotfix-1.2.1 (was abbe5d6).
Eccezione: quando esiste già un branch di release, il merge delbug fix deve essere effettuato sul release branch e non su develop
16
Contenuti
•
•
•
•
Flusso completo
Branch principali
Branch di supporto
Esperienze, strumenti e riferimenti
17
Estensione git per operazioni git-flow ad alto livello
https://github.com/nvie/gitflow
Esempi:
git flow featuregit flow feature start <name> [<base>]git flow feature finish <name>
git flow releasegit flow release start <release> [<base>]git flow release finish <release>
git flow hotfixgit flow hotfix start <release> [<base>]git flow hotfix finish <release>
18
Supporto git-flow di Source Tree (frontend per Mac e Windows)
http://blog.sourcetreeapp.com/2012/08/01/smart-branching-with-sourcetree-and-git-flow/
19
Riferimenti
Articolo originale: http://nvie.com/posts/a-successful-git-branching-model/
Git-flow con rebase: http://ctoinsights.wordpress.com/2012/06/29/git-flow-with-rebase/