Questo è un problema difficile ma che molte persone affrontano. Preferisco usare la configurazione di Gitflow come punto di partenza.
Sviluppo - > Nuove cose su cui si sta lavorando
Master - > Roba finita che necessitano di test
Produzione - > Cose che sono state pubblicate per la produzione.
In caso di funzionalità minori (più brevi) creo un ramo dallo sviluppo eseguo il lavoro e quindi uniamo il ramo allo sviluppo.
Alle funzioni principali (a lungo termine) creo un ramo dallo sviluppo, creo rami più piccoli da quel ramo, quindi unisci di nuovo al primo ramo. Una volta che la funzionalità principale è completa, torna nel ramo di sviluppo.
A intervalli regolari (dipende dal progetto) Unisco lo sviluppo al master e inizia un ciclo di test. Se si verificano delle correzioni durante il test, queste vengono eseguite nel ramo principale (sottoramo e quindi unione). E lo sviluppo può continuare sul ramo principale durante i test.
In qualsiasi momento, il master deve essere unito allo sviluppo e lo sviluppo deve essere unito a una qualsiasi delle sue sub filiali 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 esiste una differenza consiste nel fornire un solido set di funzionalità per i tester da testare.
Quando è pronto, un commit nel master testato viene unito alla produzione e l'implementazione nella produzione avviene da quel ramo. Gli HOTFIX che devono essere eseguiti in caso di emergenza possono quindi avvenire sul ramo Produzione senza dover unire in master (che potrebbe 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. Se lo fa, deve essere trasformato in piccole modifiche. Se si tratta di una funzionalità enorme (come una riscrittura dell'interfaccia utente), ciò andrà 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. Eventuali sottogruppi sono anche solo locali. Ciò 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 sviluppo. Solo quando ho una feature (set) che richiederà così tanto tempo che devo essere in grado di lavorare anche su normali risorse Dev, uso il ramo LongTerm. Se è solo un insieme di cambiamenti che dovrebbero stare insieme, allora non mi unisco a padroneggiare fino a quando tutto è finito.