Flusso di lavoro Git appropriato per più versioni attive durante la gestione degli hotfix


30

Sto cercando di scegliere un flusso di lavoro Git più appropriato per il nostro prodotto. Ecco i parametri:

  • Facciamo alcune pubblicazioni importanti all'anno, diciamo al massimo 10
  • Abbiamo più versioni del nostro prodotto attive contemporaneamente (alcune persone sono su v10.1, alcune su v11.2, ecc.)
  • Dobbiamo essere in grado di lavorare su più versioni contemporaneamente (quindi potremmo lavorare su v12.1, ma quando arriviamo alla fine della versione iniziamo a lavorare su v12.2 contemporaneamente)
  • Dobbiamo essere in grado di aggiornare i rilasci quando vengono rilevati bug critici

Finora, ecco come penso che potrebbe funzionare:

  • Viene utilizzato un singolo repository remoto
  • Crea il ramo 12.1 dal master
  • Crea rami funzione basati su 12.1, esegui il commit e ricollegali in 12.1, premi
  • Una volta che avremo bisogno di iniziare a lavorare su versioni future, creare un nuovo ramo 12.2 basato su 12.1
  • Da quel momento in poi, quando si lavora su una funzione per 12.1, creare una succursale dalla 12.1, eseguire il commit delle modifiche ed unire in 12.1 e 12.2, premere
  • Se si lavora su una funzione per 12.2, creare un ramo da 12.2, eseguire il commit delle modifiche e unire solo in 12.2, premere
  • Una volta completata la versione 12.1, uniscilo nel master e tagga il ramo master con 12.1
  • Se è necessario un aggiornamento rapido, creare un ramo di aggiornamento rapido dal ramo di rilascio più vecchio che ne ha bisogno, eseguire il commit delle modifiche e ricollegarlo a tutti i rami di rilascio per quella versione e le versioni future che potrebbero essere interessate; se è stato interessato l'ultimo ramo di versione stabile, uniscilo nel master.

Ho alcune preoccupazioni:

  • Non sono sicuro che la fusione di hotfix da vecchi rami in nuovi rami sarà un processo regolare, soprattutto se ci sono state molte modifiche sovrapposte; sarebbe più intelligente semplicemente l'aggiornamento rapido manualmente in ogni ramo nei casi in cui sembra che ci saranno conflitti
  • I modelli di flusso di lavoro che ho visto sembrano non mantenere molto attivi i rami di rilascio, una volta fatto il rilascio viene unito in master, etichettato e rimosso. Il mio problema è che non ho una buona idea su come gestire lo stato della versione se tutto ciò che ho sono tag nel master, sembra più facile effettuare l'aggiornamento rapido in un ramo e quindi ho una versione in cui posso sempre tornare indietro con l'ultimo aggiornamento rapido (posso anche contrassegnare gli aggiornamenti rapidi nella versione). Non sono sicuro che ci sia un modo per tornare indietro in master e in qualche modo avere una copia della versione con hotfix applicati e aggiornare quel tag.

I commenti sono apprezzati su cose che potrei aver trascurato o sui modi migliori per realizzare le cose, dati i requisiti che ho specificato.



11
Sono a conoscenza di git-flow, ma non vedo come risolva il problema lavorando su più versioni simultanee. Sembra che i rami di rilascio non siano nemmeno fatti per fare alcun lavoro, principalmente per fare pulizia e quindi unire e taggare. Cosa devo fare quando ho un hotfix che interessa 4 diverse versioni di rilascio? Immagino di poter effettuare il checkout di una versione taggata dal master, ma una volta che ho apportato delle correzioni, come potrei rielaborare qualsiasi correzione che ho apportato al master per quella particolare versione. Sembra che sarebbe piuttosto difficile.
Rocket04,

Se è necessario correggere a caldo più versioni con la stessa correzione, è probabile che sia necessario correggere prima la versione più vecchia e unirla a quella più recente, adattandosi per adattarsi a ciascuna versione. Se lavori di nuovo in vecchio, rischi di eliminare le dipendenze dalle versioni successive, il che complicherebbe le cose.
axl

E come menziono nella mia risposta proposta, il ramo master non funziona così bene con più versioni live, quindi a meno che tu non ne abbia davvero bisogno per qualche motivo, ti consiglierei di non usarlo.
axl

Risposte:


9

Sembra che si stia ramificando su ogni versione principale (12.0.0), quindi con possibili aggiornamenti minori a ciascuna (12.1.0) e hot fix (12.2.1). Corretta?

Non esiste un motivo specifico per cui non è possibile mantenere attivi i rami di rilascio in GitFlow dopo l'uscita di un rilascio, a parte il fatto che coordinare i cambiamenti tra più rami divergenti per lungo tempo è difficile con qualsiasi modello. Suppongo che GitFlow sia stato anche modellato maggiormente per prodotti che mantengono una singola versione live durante lo sviluppo di quella successiva.

Vorrei rimanere con GitFlow e fare alcuni emendamenti;

Salta il ramo principale. Finora non ne ho fatto alcun uso pratico e perderebbe la sua linearità nel modo in cui lavori. Mantenere lo sviluppo sulla prossima versione principale di sviluppo. Se decidi di mantenere il master, non mettere i tag di rilascio sul master, inseriscili nell'ultimo commit sul ramo di rilascio che ha prodotto il file binario che stai spedendo.

Non gettare via i rami di rilascio dopo averli nuovamente uniti per svilupparli. Invece tenerli in giro per la prossima versione minore e possibili hotfix. Se mai smettessi di supportare una versione, suppongo che vada bene eliminarli. È possibile denominare i rami di rilascio in base al loro componente principale, rilascio / 12, e quindi creare rami di rilascio secondario, rilascio / 12.1, rilascio / 12.2 di esso. Non ho dovuto preoccuparmi troppo di questo livello di parallelismo, ma probabilmente è quello che proverei. In questo caso puoi pensare a ciascun ramo di rilascio principale come al suo ambiente sub-GitFlow.

Se devi lavorare in parallelo su funzionalità per diverse versioni importanti future allo stesso tempo, forse devi mantenere il prossimo (13) su sviluppo e qualsiasi cosa per le versioni successive (14, 15) su rami "sviluppo-N" aggiuntivi . Sembra molto difficile da mantenere in generale, ma sarebbe possibile.


3

Sembra che una possibile soluzione per il tuo problema principale ( «Dobbiamo essere in grado di lavorare su più versioni contemporaneamente [...]» ) è fare ungit worktree add <path> [<branch>]

Un repository git può supportare più alberi di lavoro , consentendo di estrarre più di un ramo alla volta.
A git worktree add, un nuovo albero di lavoro è associato al repository.

Questo nuovo albero di lavoro è chiamato "albero di lavoro collegato" in contrapposizione al "albero di lavoro principale" preparato da " git init" o " git clone" .
Un repository ha un albero di lavoro principale (se non è un repository nudo) e zero o più alberi di lavoro collegati.

Vedi questa risposta SO per un'introduzione dettagliata su git worktree.


1

Hai detto che hai familiarità con gitflow. Suggerisco di aggiungerlo per il tuo scenario. Sarà necessario creare filiali dal proprio ramo di sviluppo per supportare le versioni precedenti. Queste versioni precedenti dovranno inoltre avere i propri rami release / master e rami hotfix. Sarà necessario unire periodicamente i rami di supporto nei rami di supporto più recenti e nel ramo di sviluppo.

Poiché lo sviluppo delle versioni principali divergerà, questo continuerà a diventare più difficile. Non esiste un proiettile d'argento per questo. A volte sarà più semplice apportare modifiche manualmente. Il costo di mantenimento delle versioni precedenti aumenterà e ad un certo punto non ne varrà più la pena.

Tutto dipende dal tipo di modifiche che stai apportando nelle tue versioni precedenti. Se solo correzioni di bug, è relativamente facile da unire. Se provi ad aggiungere nuove funzionalità, sarà difficile.


Ma come ho già detto, nel caso di git-flow non sembra che usino molto i rami di rilascio. Non sembrava che ci fosse un grande sviluppo in corso lì. Sembra anche che il ramo di sviluppo sia un po 'inutile se stiamo lavorando principalmente nei rami di rilascio, potremmo anche liberarcene, ogni ramo di rilascio è essenzialmente un ramo di sviluppo per un certo periodo di tempo. Oppure mi sfugge qualcosa?
Rocket04,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.