Questo è un problema difficile ma che molte persone devono affrontare. Preferisco usare la configurazione di Gitflow come punto di partenza.
Sviluppo -> Nuove cose in lavorazione su
Master -> Oggetti finiti che necessitano di test di produzione -> Oggetti che sono stati pubblicati sulla produzione.
A funzioni minori (più brevi) creo un ramo dallo sviluppo, faccio il lavoro lì e unisco il ramo allo sviluppo.
Per le funzionalità principali (a lungo termine) creo un ramo dallo sviluppo, creo rami più piccoli da quel ramo, quindi ricollego al primo ramo. Una volta completata la funzionalità principale, torna al ramo di sviluppo.
A intervalli regolari (dipende dal progetto), lo sviluppo viene nuovamente unito al master e inizia un ciclo di test. Se nel test vengono rilevate delle correzioni, queste vengono eseguite nel ramo principale (ramo secondario quindi unisci). E lo sviluppo può continuare sul ramo principale durante i test.
In qualsiasi momento il master dovrebbe essere unito allo sviluppo e lo sviluppo dovrebbe essere unito a uno qualsiasi dei suoi rami secondari a lungo termine.
il maestro dovrebbe sempre (in teoria) essere pronto per la produzione. Lo sviluppo dovrebbe sempre (in teoria) essere pronto per la produzione. L'unica ragione per cui c'è una differenza nel fornire un solido set di funzionalità che i tester possono testare.
Quando è pronto, un commit nel master testato viene unito alla produzione e la distribuzione in produzione avviene da quel ramo. Gli HOTFIX che devono essere eseguiti in caso di emergenza possono quindi avvenire nel ramo di produzione senza dover unirsi al master (che può avere molte modifiche non testate).
Il mio albero normale sembra
LongTerm -> Development -> Master -> Production
LongTerm <- Development | |
| Development -> Master |
LongTerm <- Development -> Master |
Development <- Master |
Master -> Production
La mia regola generale è che nessun singolo cambiamento dovrebbe richiedere più di qualche ora. In tal caso, è necessario apportare modifiche minori. Se si tratta di un'enorme funzionalità (come una riscrittura dell'interfaccia utente), va a lungo termine in modo che lo sviluppo normale possa continuare allo stesso tempo. Le filiali LongTerm sono normalmente solo filiali locali mentre Sviluppo, Master e Produzione sono filiali remote. Anche tutti i rami secondari sono solo locali. Questo mantiene il repository pulito per gli altri, senza perdere l'utilità di git su un set di funzionalità a lungo termine.
Vorrei sottolineare, tuttavia, che l'esistenza di un ramo a lungo termine è una cosa rara. Normalmente, tutto il mio lavoro è in fase di sviluppo. Solo quando ho una funzione (impostata) che impiegherà così tanto tempo che devo essere in grado di lavorare anche su normali cose di sviluppo, uso il ramo LongTerm. Se è solo una serie di modifiche che dovrebbero essere insieme, allora non mi unirò al padrone fino a quando tutto non sarà fatto.