La risposta dipende dalle dimensioni del team e dalla qualità del controllo del codice sorgente e dalla capacità di unire correttamente set di modifiche complessi. Ad esempio nel controllo del codice sorgente completo come CVS o SVN la fusione può essere difficile e potresti stare meglio con il primo modello, mentre se utilizzi un sistema più complesso come IBM ClearCase e con un team di dimensioni maggiori potresti essere migliore con il secondo modello o una combinazione dei due.
Personalmente, separerei il modello di ramo di funzionalità, in cui ogni caratteristica principale è sviluppata su un ramo separato, con sotto-rami di attività per ogni modifica eseguita da uno sviluppatore individuale. Man mano che le funzioni si stabilizzano, vengono unite al tronco, che si mantiene ragionevolmente stabile e superando tutti i test di regressione in ogni momento.Quando ti avvicini alla fine del ciclo di rilascio e tutte le ramificazioni delle feature si uniscono, ti stabilizzi e si ramifichi un ramo del sistema di rilascio su cui fai solo correzioni di bug di stabilità e backport necessari, mentre il tronco viene utilizzato per lo sviluppo della prossima release e tu di nuovo diramazione per nuove filiali di funzionalità. E così via.
In questo modo il trunk contiene sempre il codice più recente, ma si riesce a mantenerlo ragionevolmente stabile, creando etichette stabili (tag) sulle principali modifiche e fusioni di funzionalità, i rami di funzionalità sono sviluppo veloce con integrazione continua e attività individuali le filiali possono essere spesso aggiornate dal ramo della funzione per consentire a tutti di lavorare sulla stessa funzione in sincronia, senza tuttavia influire sugli altri team che lavorano su funzionalità diverse.
Allo stesso tempo si ha attraverso la cronologia una serie di rami di rilascio, in cui è possibile fornire backport, supporto e correzioni di errori per i propri clienti che per qualsiasi motivo rimangono su versioni precedenti del prodotto o anche solo l'ultima versione rilasciata. Come nel caso del trunk, non si imposta l'integrazione continua sui rami di rilascio, ma vengono attentamente integrati al superamento di tutti i test di regressione e di altri controlli di qualità.
Se per qualche motivo due funzioni sono co-dipendenti e devono essere apportate modifiche reciproche, è possibile considerare di sviluppare entrambi sullo stesso ramo di funzionalità o di richiedere che le funzioni uniscano regolarmente parti stabili del codice a trunk e quindi aggiorna le modifiche dal tronco per scambiare il codice tra i rami del tronco. Oppure, se è necessario isolare queste due funzioni da altre, è possibile creare un ramo comune da cui si diramano i rami delle funzioni e che è possibile utilizzare per scambiare il codice tra le funzioni.
Il modello di cui sopra non molto senso con squadre sotto 50 sviluppatori e sistema di controllo del codice sorgente senza rami radi e la corretta funzionalità di fusione come CVS o SVN, che sarebbe solo rendere questo prodotto a un incubo da configurare, gestire e integrare.
Nota a margine: alcuni sostengono che anche se vengono introdotte nuove funzionalità, tutto dovrebbe sempre essere stabile. D'altra parte, potrebbe essere in qualche modo idealistico. –
Controlla anche questo articolo: http://www.yegor256.com/2014/07/21/read-only-master-branch.html – yegor256