Lavoro su una squadra con un grande codice Java (300k + linee di codice), che ha recentemente adottato Git come controllo del codice sorgente (migrato da ClearCase). Stiamo usando Git Flow come nostra strategia di ramificazione. Ci sono un paio di casi d'uso che incontriamo abbastanza frequentemente con cui abbiamo lottato.Rimozione di funzionalità da versioni in Git Flow
Abbiamo unito tutte le nostre caratteristiche nel ramo sviluppare per essere utilizzato in una prossima release. Quando ci avviciniamo al rilascio, risulta che una funzione non può essere pubblicata (a causa del fatto che il client non è pronto o per altri motivi). Qual è il modo migliore per creare il ramo di rilascio, ma tralasciare una funzione specifica (su molti commit)? La funzionalità deve essere disponibile per essere inclusa nella prossima versione futura. Quello che abbiamo provato prima è fare un "git revert" su tutti i commit, creare il ramo di rilascio, quindi fare un "git revert" sui commit ripristinati. Questo è un approccio piuttosto doloroso, in particolare per le grandi caratteristiche.
Abbiamo già creato il ramo di rilascio, ma prima che il rilascio venga pubblicato, è determinato che una funzione deve essere rimossa. Simile al primo caso d'uso, questa funzione deve essere in grado di passare a una versione successiva. Per questo motivo, solo eseguire un "git revert" sui commit non lo risolve completamente, poiché i ripristini torneranno a fondersi nel ramo di sviluppo quando eseguiamo un "git flow release finish".
Come indicato nel modello di Git di flusso, tutti i commit sono fatte su questi rami, e mai direttamente sul ramo svilupparsi. Quando una funzionalità è completa e pronta per la prossima versione, viene quindi unita per lo sviluppo. Quando è il momento della prossima versione, il ramo di rilascio viene creato fuori dallo sviluppo. Dopo che la versione è stata sottoposta a test di regressione e risolta se necessario, passa alla produzione e viene unita al master, e torna a svilupparsi in caso di correzioni di bug e taggata con un numero di versione. I problemi di cui sopra arrivano quando una caratteristica che pensavamo andasse nella prossima versione finisce per essere lasciata fuori.
Quali sono i metodi migliori per gestire queste situazioni? In entrambi questi scenari, i rami sono stati pubblicati e abbattuti da molti sviluppatori, quindi fare confusione con la storia può creare difficoltà. So che questi sono tutt'altro che ideali, ma sfortunatamente le situazioni sono fuori dal nostro controllo.
È possibile evitare di commutare direttamente su * development * e creare un ramo di rilascio a partire dall'ultima versione. In questo modo è possibile unire in modo selettivo le funzionalità che si desidera incorporare nella nuova versione. –
@AndrewC Ho aggiornato la mia domanda con alcune informazioni aggiuntive. – NickForrer
@Zeeker nessun commit viene effettuato direttamente sul ramo di sviluppo. Sono uniti da un ramo di funzionalità. Se uniamo feature da rilasciare invece di sviluppare, non risolve il secondo caso d'uso. – NickForrer