Credo che il tuo stile di ramificazione debba essere basato sulla tua strategia di rilascio:
- Sviluppo prodotto / libreria
- Rilasci basati su Sprint
- Implementazione continua
Storicamente, mi sono concentrato sullo sviluppo di prodotti e librerie. In quel mondo, di solito hai più versioni in uso simultaneo e l'implementazione potrebbe essere notevolmente diversa tra le versioni, in modo che le correzioni di bug per una versione non possano essere semplicemente unite in un'altra versione. Per supportare questo, utilizzo la seguente struttura:
- Branche delle feature: singole unità di lavoro, che iniziano come parte di una release ma potrebbero o meno finire in quella versione .
- Un ramo di rilascio, che riceve commit schiacciati di funzionalità (e viene regolarmente unito ai rami delle funzionalità per ridurre al minimo i conflitti).
- Master, che contiene la versione più recente della codebase.
La chiave qui è che un ramo Release continuerà ad essere attivo dopo essere stato unito al master e ricevere modifiche che potrebbero o meno essere presenti altrove. Ad esempio, mentre lavori sul ramo rel_1_9
, potresti fare una correzione su rel_1_2
e taggare quel bugfix con rel_1_2_7
.
In questo approccio, in realtà non c'è bisogno di Master: puoi creare un nuovo ramo di rilascio dal tag di rilascio e impostarlo come ramo predefinito. Ma ad alcune persone piace avere master
quindi ...
L'ambiente alternativo è quello in cui si fanno periodici rilasci, ma non si ritorna mai a versioni precedenti (ad esempio, una tipica app in hosting). In tal caso, ritengo che la strategia di ramificazione dipenda dal fatto che si pratichi la distribuzione continua o gli sprint.
Per gli sprint, Develop è utile come un ramo di integrazione: tutto il nuovo lavoro viene incorporato in esso dai rami Feature, ma non viene unito a Master fino allo sprint. Durante lo sprint, le hot-fix possono essere commesse su Master e quindi unite in Develop. Non c'è davvero alcun motivo per creare filiali separate per ogni versione; se il ramo non viene mai toccato dopo l'unione, è semanticamente identico a un tag.
E se stai facendo una distribuzione continua, ti consiglio di mantenere i rami Feature e Master e di eliminare lo sviluppo. Se hai più sviluppatori che uniscono il loro lavoro a Develop prima di Master, avrà una situazione in cui le modifiche indesiderate verranno unite e implementate.
Autopromozione senza vergogna: link