In ambito sviluppo è molto importante il concetto di VCS (Version Control System), in quanto consente a più sviluppatori o team di lavorare in modo isolato su uno stesso progetto senza influire sul lavoro degli altri. Questo isolamento consente di costruire, testare, integrare o addirittura eliminare le funzionalità in modo controllabile, trasparente e mantenibile.
Il VCS è un sistema che consente di gestire la modifica dei software in fase di sviluppo; più nel dettaglio registra le modifiche che un file, o un insieme di questi, subiscono nel tempo, in modo da poter accedere a tutti i dettagli relativi alle modifiche individuando non solo quando ma anche chi ha apportato una determinata modifica. Questo consente non solo di tenere monitorata l’intera fase di sviluppo e di poter confrontare le modifiche che un file ha subito nel tempo, ma anche di ripristinare file selezionati, o addirittura l’intero progetto, a uno stato precedente (revert).
Inizialmente pubblicato da Vincent Driessen su nvie , è un workflow Git cha aiuta nel continuous software development e definisce un branching model ben definito orientato a progetti schedulati da ciclici di rilasci tramite release. La sua particolarità è di non aggiungere nessun nuovo concetto alla struttura base di GIT, rimanendo negli standard definiti, fattore molto importante nello sviluppo, ma assegna ruoli specifici a differenti tipi di branch in base al loro scopo, definendo inoltre quando questi dovranno interagire tra loro e aiutando così gli sviluppatori a seguire un determinato flusso di lavoro.
Ciò significa che determina il tipo di rami da impostare e come unirli. Utilizza i singoli rami per la preparazione, la manutenzione e la registrazione dei rilasci.
I rami principali:
- Il ramo Master memorizza la cronologia delle versioni ufficiali. Contiene una versione ridotta del tuo progetto. È il nucleo del modello di ramificazione con una durata infinita.
- Il ramo Development è un ramo di integrazione per le funzionalità. Contiene la cronologia completa del tuo progetto. Ha anche una durata infinita. Quando il codice in questo ramo è stabile e pronto per una versione, le modifiche vengono unite al ramo principale e contrassegnate con un numero di versione.
Branches di supporto:
- I rami di feature vengono creati per ogni nuova funzione. Il loro ramo genitore è il ramo di sviluppo. Le funzionalità non dovrebbero mai interagire direttamente con il ramo principale.
- Il ramo di rilascio viene creato quando sono disponibili funzionalità sufficienti per un rilascio. Consente a un team di lavorare su una versione corrente mentre un altro team continua a lavorare sulle funzionalità per la versione successiva. Il genitore dei rami di rilascio è anche il ramo di sviluppo. Questa branch è il luogo in cui deriva la consegna continua.
- I rami hotfix sono rami di manutenzione. Sono creati per patchare rapidamente il rilascio di produzione. Questi rami consentono al team di correggere gli errori senza interrompere il flusso di lavoro o attendere il rilascio successivo. Il loro genitore è il ramo principale. I rami di hotfix sono gli unici rami ad essere biforcati direttamente dal ramo principale. È possibile automatizzare la creazione del ramo di aggiornamento rapido: ogni volta che viene visualizzato un errore, il ramo di aggiornamento rapido viene creato automaticamente.
Perché utilizzare Git Flow?
- Git Flow semplifica lo sviluppo parallelo perché isola il nuovo sviluppo dal progetto rilasciato. Puoi lavorare su qualsiasi versione del progetto. Il nuovo sviluppo viene eseguito in rami di funzionalità, quindi viene unito di nuovo quando lo sviluppatore ha completato lo sviluppo.
- Il team può collaborare meglio e dedicare meno tempo alla gestione delle versioni del progetto se utilizza una strategia di branching semplice e chiara, come questa.
- Puoi sempre creare un nuovo ramo di funzionalità quando devi interrompere il lavoro precedente, come puoi tornare alla funzionalita precedente in qualsiasi momento (revert).
- I rami di hotfix consentono di apportare modifiche di emergenza. Non devi preoccuparti di fonderti accidentalmente in un nuovo sviluppo.
Esistono molte applicazioni diverse che supportano il modello di ramificazione di Git Flow con impostazioni di funzionalità specifiche (come SourceTree , SmartGit o GitKraken ). Scegli l'applicazione adatta al tuo sistema operativo per inizializzare Git Flow. Personalizza la configurazione del tuo progetto seguendo questi passaggi:
- Inizia a utilizzare git-flow clonando un repository git esistente.
- Crea un ramo di sviluppo vuoto per completare il ramo principale predefinito. Successivamente invialo al server.
- Lo sviluppo di nuove funzionalità inizia dal ramo di sviluppo. Ogni caratteristica risiede nel proprio ramo.
- Unisci nuovamente il ramo di funzionalità nel ramo di sviluppo quando lo sviluppoe della funzionalità è terminata.
- Crea un ramo di rilascio quando le funzionalità sono pronte per un rilascio. Il genitore è il ramo di sviluppo.
- Unisci il ramo di rilascio nel ramo principale e taggalo con un numero di versione. Successivamente, viene nuovamente unito al ramo di sviluppo in modo che i progressi dalla versione vengano salvati. In fine il ramo di rilascio verrà eliminato.
- Se è necessario apportare alcune modifiche critiche, come bug, creare un ramo di hotfix. Biforcare il ramo direttamente dal ramo principale. Quando hai finito con le modifiche, unisci il ramo dell'aggiornamento rapido sia al ramo master che a quello sviluppato. Contrassegna il ramo principale con un numero di versione aggiornato.
- Qualità del codice scadente
- Clienti insoddisfatti
- Accumulo di conoscenza
- Mentalità "Non è un mio problema"
- Lavoro inutile
Gitflow è un altro strumento nell'ampio arsenale di sviluppo. Con il suo aiuto, possiamo coordinare in modo efficiente il lavoro tra i prolifici sviluppatori di software, lavorare su vari obiettivi del progetto tra cui nuove funzioni, caratteristiche sperimentali e correggere i difetti lavorando in parallelo senza influenzare il codice dell'altro. Il flusso di lavoro è un miglioramento estremamente importante per qualsiasi processo di sviluppo software, poiché ci consente di apportare modifiche sicure ai progetti supportando una base di codice affidabile.