Check the flow:
Git workflow with GitFlow
Carmine De Rosa
Why Git?
Prima di iniziare a parlare di Git, ed in particolar modo di GitFlow, è bene fare una panoramica dei sistemi di controllo del codice sorgente più usati...
1 minuto di silenzio
Se credete che questo sia un metodo efficace o anche solo "sufficiente" a garantire un adeguato controllo del codice, cambiate lavoro!
Prima di Git
Prima che Git facesse la sua comparsa (per mano di Linux Torvalds), i sistemi di versioning più diffusi erano CVS, SVN, etc... molti di questi sistemi utilizzavano un modello centralizzato e rendevano lo sviluppo collaborativo un vero incubo.
Modello centralizzato
Il modello centralizzato prevede un unico repository ed un sistema di lock, cosicchè uno sviluppatore per volta ha diritto di accesso in scrittura alla copia di quel file contenuta nel repository centrale.
Modello distribuito
Nei modelli distribuiti ogni sviluppatore ha un proprio repository locale, cosicchè da poter operare anche senza avere una connessione...
SVN vs GIT
|
SVN |
Git |
Controllo di versione |
Centrale |
Distribuito |
Repository |
Repository centrale in cui vengono create le copie di lavoro |
Copie locali del repository su cui poter lavorare |
Permesso di accesso |
Basato sul percorso |
Per tutta la directory |
Visualizzazione delle modifiche |
Registra i file |
Registra i contenuti |
Cronologia delle modifiche |
Completa solo nel repository, le copie di lavoro contengono solo la versione più recente |
Repository e copie di lavoro contengono la cronologia completa |
Connessione di rete |
Ad ogni accesso |
Necessaria solo per la sincronizzazione |
Git classic workflow
Il sistema di versioning di Git si divide in rami o branches, il workflow classico di Git prevede N branches, il primo è il Master e gli altri sono di Develop
Il primo branch (Master) è sostanzialmente deputato ai rilasci, mentre i branches di Develop vengono utilizzati per lo sviluppo.
Init
Prima di tutto creiamo ed inizzializziamo la nostra repo, per fare ciò sufficiente creare una directory e lanciare:
$ git init
L'operazione creerà una directory nascosta .git contenente la configurazione della repo.
La repo è composta da tre "alberi" mantenuti da Git. Il primo è la Directory di lavoro che contiene i files attuali. Il secondo è l'Index che fa da spazio di transito per i files e per finire l'HEAD che punta all'ultimo commit fatto.
Clone
Se invece partiamo da da una repo già esistente, possiamo clonarla con il comando:
$ git clone /path/to/repository
ES:
$ git clone https://github.com/dslak/GitFlow.git
Pull
Ogni volta che un utente inizia a lavorare su una nuova feature fa il pull, ovvero fa il fetch&merge delle modifiche presenti sul server remoto sulla propria repo locale, in modo da allinearsi.
Ad ogni modifica effettua un commit in modo da tenere traccia delle modifiche passo passo.
Commit
Ad ogni modifica effettuata è bene fare un commit in modo da tenere traccia delle modifiche passo passo.
NB: i commit sono gratis!
$ git commit -m 'modificata area utente'
$ git commit -m 'aggiunto controllo'
È buona prassi specificare un messaggio di commit esplicativo, "fix" non lo è!
Push
Una volta completato lo sviluppo di una feature si procede con l'invio delle modifiche locali al branch (in questo caso master) sulla repo principale in modo da renderla disponibile agli altri sviluppatori.
$ git push origin master
Merge
Nel caso in cui si abbia bisogno di modifiche presenti su un altro branch, è possibile effettuare il merge di due branch.
$ git push merge branch
Diff
Git tenterà di incorporare automaticamente le modifiche, se ciò non è possibile, Git, ci segnalerà che sono presenti dei conflitti, e che quindi bisogna risolverli manualmente.
Una volta fattto ciò si potranno visualizzare le differenze prima di effettuare il merge digitando
$ git diff branch_sorgente branch_target
Altri comandi
$ git add nomedelfile // Agginge un file all'INDEX
$ git remote add origin server // Connette la repo locale al server remoto
$ git checkout -b feature_x // Crea un nuovo branch e passa ad esso
$ git checkout feature_x // Passa ad un branch esistente
$ git checkout -d feature_x // Cancella un branch
$ git tag 1.0.0 commitID // Crea un tag, utile per il rilascio
$ git log feature_x // Restituisce il commitID
GitFlow
Negli anni si è sfruttata la versatilità di Git per creare workflow sempre più efficienti, un esempio è GitFlow.
GitFlow si basa essenzialmente su 5 branches:
Master, Hotfix, Release, Develop e Feature.
GitFlow branches
Master | è il ramo principale, contiene il codice in produzione. |
Hotfix | utilizzato per fix veloci sul codice in produzione. |
Release | utilizzato per i rilasci. |
Develop | è il ramo principale di sviluppo. |
Feature | contiene tutte le feature. |
Master
Master è utilizzato quasi esclusivamente dai reviewer, quando una fase di sviluppo è completa i reviewer effettuano un merge di Develop su Master, in modo rendere il codice disponibile in produzione.
L'unico caso in cui un utente può fare una pull-req su Master è in caso di Hotfix
Hotfix
Questo branch viene utilizzato solo in casi eccezionali, ovvero quando si rende necessaria una modifica veloce al codice in produzione.
Le modifiche vengono pushate su Master e successivamente da Master a Develop, in modo da renderle disponibili a tutto gli sviluppatori.
Release
Questo branch contiene solo ed esclusivamente i rilasci, ovvero il software così come viene prelevato dall'utente finale.
Solitamente è accompagnato da un tag che ne indica la versione.
Develop
È il vero e proprio ramo di sviluppo, il punto di partenza di ogni fase di sviluppo.
Prima di iniziare una fase di sviluppo è bene fare il pull di Develop, in modo da essere sicuri che il codice sul quale si sta lavorando sia allineato all'ultima versione.
Develop e Feature
La differenza principale tra il workflow classico e GitFlow sta nell' utilizzo di un numero fisso di branches e l'interazione tra Develop e Feature.
Il concetto stesso di Feature rende il disegno apparentemente più complesso, ma allo stesso tempo garantisce un controllo maggiore.
Feature
La particolarità del branch Feature, è che esso è diviso in diversi sotto-branches, le features appunto.
Questo permette al team di sviluppo di avere un controllo più capillare sul flusso di lavoro e velocizzare la risoluzione dei conflitti.
Feature
Una volta completato il lavoro sulla feature viene fatto il push ed effettuata una pull-req su Develop.
NB: nell'effettuare la pull-req è possibile richiedere o meno la chiusura della feature
Feature by Feature
Se il lavoro che abbiamo appena effettuato su una feature è stato pushato ma non ancora mergiato su Develop, ed abbiamo bisogno di quelle modifiche per la creazione di una nuova feature, è sempre possibile partire dalla propria feature.
Merge di Feature
Può capitare di aver bisogno di una modifica (pushata ma non ancora mergiata su Develop) effettuata da un altro utente, in questo caso è possibile fare il merge tra features.
Stash
Se abbiamo fatto il checkout su una feature ma dobbiamo passare ad un altra feature, possiamo congelare le modifiche facendo uno stash.
Tutte le modifiche potranno essere eliminate oppure applicate alla stessa o ad un altra feature in un secondo momento.
Rebase
Può capitare di dover lavorare su una feature esistente dopo aver lavorato su altre feature, se facciamo il checkout sulla feature in questione torniamo indietro nella history e perdiamo le modifiche successive.
Effettuando il rebase creiamo un avanzamento delle history fino al commit corrente.
Installazione
Installare GitFlow è semplice, basta seguire le istruzioni sulla repo del progetto: https://github.com/nvie
$ curl -OL https://raw.github.com/nvie/gitflow/develop/contrib/gitflow-installer.sh
$ chmod +x gitflow-installer.sh
$ sudo ./gitflow-installer.sh
GUI
Data la complessità del modello è consigliabile utilizzare un software con una interfaccia grafica che faciliti le operazioni.
Esistono diversi software che supportano GitFlow, uno dei migliori (IMHO) è GitKraken :)
https://www.gitkraken.com/
Riferimenti
Git | https://git-scm.com |
GitHub | https://www.github.com |
GitKraken | https://www.gitkraken.com |
GitFlow guide | https://www.atlassian.com/git/tutorials/comparing-workflows#gitflow-workflow |
GitFlow | https://github.com/nvie/gitflow |