Strategia Git Branch per piccoli team di sviluppo [chiuso]


186

Abbiamo un'app Web che aggiorniamo e rilasciamo quasi quotidianamente. Usiamo git come nostro VCS e la nostra attuale strategia di branching è molto semplice e rotta: abbiamo un branch master e controlliamo i cambiamenti di cui "ci sentiamo bene". Funziona, ma solo fino a quando non verificheremo un cambiamento di rottura.

Qualcuno ha una strategia preferita di git branch per piccoli team che soddisfa i seguenti requisiti:

  1. Funziona bene per team da 2 a 3 sviluppatori
  2. Processo leggero e non troppo
  3. Consente agli sviluppatori di isolare facilmente il lavoro su correzioni di bug e funzionalità più grandi
  4. Ci consente di mantenere un ramo stabile (per quei momenti "oh merda" in cui dobbiamo far funzionare i nostri server di produzione)

Idealmente, mi piacerebbe vedere il tuo processo passo-passo per uno sviluppatore che sta lavorando a un nuovo bug

Risposte:


247

Potresti trarre vantaggio dal flusso di lavoro descritto da Scott Chacon in Pro Git . In questo flusso di lavoro, hai due rami che esistono sempre, padroneggiare e sviluppare .

master rappresenta la versione più stabile del progetto e la distribuzione da questo ramo è sempre possibile.

sviluppo contiene modifiche in corso e che potrebbero non essere necessariamente pronte per la produzione.

Dal ramo di sviluppo , si creano rami di argomento per lavorare su singole funzionalità e correzioni. Una volta che la funzione / correzione è pronta per essere utilizzata, la si unisce in Sviluppo , a quel punto è possibile verificare il modo in cui interagisce con altri settori di argomenti in cui i colleghi si sono uniti. Una volta che lo sviluppo è in uno stato stabile, unirlo in Master . Dovrebbe essere sempre sicuro distribuire in produzione dal master .

Scott descrive questi rami di lunga data come "silos" di codice, in cui il codice in un ramo meno stabile alla fine si "diplomherà" in uno considerato più stabile dopo i test e l'approvazione generale da parte del team.

Passo dopo passo, il tuo flusso di lavoro con questo modello potrebbe apparire così:

  1. Devi correggere un bug.
  2. Crea un ramo chiamato myfix basato sul ramo di sviluppo .
  3. Lavora sul bug in questo ramo dell'argomento fino a quando non viene corretto.
  4. Unisci myfix in sviluppo . Esegui test.
  5. Scoprirai i conflitti della tua correzione con un altro argomento relativo alla sua correzione che il tuo collega si è fuso durante lo sviluppo della tua correzione.
  6. Apporta ulteriori modifiche nel ramo myfix per gestire questi conflitti.
  7. Unisci myfix per sviluppare ed eseguire nuovamente i test.
  8. Tutto funziona bene. Unisci si sviluppa in maestro .
  9. Distribuisci in produzione dal master in qualsiasi momento, perché sai che è stabile.

Per maggiori dettagli su questo flusso di lavoro, consulta il capitolo Branching Workflows in Pro Git.


7
Anche Scott Chacon ha un eccellente articolo sul suo sito su come flusso di lavoro di Github con Git funziona - scottchacon.com/2011/08/31/github-flow.html
program247365

71
Penso che sia grandioso, tranne se si creano rami di correzione di bug dal ramo di sviluppo, si sta forzando non si può unire in master e distribuirlo senza fondersi anche in tutto il resto "nuovo" che non è stato ancora rilasciato, che potrebbe essere una vera seccatura se c'è qualcosa in quel ramo che necessita di modifiche alla documentazione / al database o qualcos'altro difficile da fare. Penso che per "hotfix" urgenti, dovresti creare il tuo ramo dal master.
Richard

5
E se stiamo sviluppando 2 funzioni separate, F1 e F2, in cui la F1 verrà rilasciata in una settimana ma F2 verrà rilasciata in 2 settimane, supponendo che lo sviluppo di F1 e F2 coincida? Qualche suggerimento al riguardo?
Murat Derya Özen,

4
Il developè una 'soluzione' unecessary ad un problema che git non ha. Per quanto ne so, il successo è dovuto a un articolo ben scritto se fuorviato e senza commenti consentiti. Ecco un contro-articolo barro.github.io/2016/02/…
Tim Abell,

5
Al passo 8, fondere il ramo di sviluppo in master sembra una cattiva idea dato che parte del codice in sviluppo potrebbe non essere pronto per essere messo in produzione. Non staremmo meglio unendo il ramo delle caratteristiche in master?
Todd,

45

Dopo essere arrivato come un principiante, cerca di trovare una strategia diretta per insegnare ad altri sviluppatori che non hanno mai usato il controllo del codice sorgente. Questo è quello che si adatta a http://nvie.com/posts/a-successful-git-branching-model/ Ho provato a usare il flusso di lavoro GIT standard che è nelle pagine man ma mi ha confuso leggermente e il mio pubblico completamente.

Negli ultimi 6 mesi ho dovuto solo risolvere i conflitti due volte. Ho aggiunto dei passaggi per testare sempre dopo un'unione e per "recuperare e unire" o "pull --rebase" molto (una volta al mattino e al pomeriggio) durante lo sviluppo di funzionalità. Abbiamo anche usato github.com come posto centrale per estrarre l'ultimo codice.


Questo è un collegamento eccellente! Tale flusso di lavoro funziona egregiamente per il nostro piccolo team che lavora sempre in remoto e parallelamente su più versioni di rilascio alla volta. Molto ben documentato Grazie frizione!
keithxm23,

Ah, quindi è qui che ho trovato quel link :-) Ho esaminato diverse strategie Git prima di impostare il mio primo progetto Git (negli anni sono passato da SCCS a CVS a SVN e ora volevo provare Git per un nuovo progetto ) e questo era quello che per me aveva più senso. Riconosco il tuo post, quindi sono abbastanza sicuro che è qui che l'ho trovato. Quindi grazie - funziona meravigliosamente bene!
Boise,

4
Muoio un po 'dentro ogni volta che vedo qualcuno riprendere quel post sul blog. Ecco una confutazione: barro.github.io/2016/02/…
Tim Abell,

Condivido la stessa sensazione con te @TimAbell; Sento fortemente che non è giusto quando default master branchNON viene utilizzato il più spesso sviluppatore in questoA successful Git branching model
Nam G VU

35

(Il mio commento qui sopra è una risposta personale, come avrei dovuto inizialmente.)

Da Scott Chacon di Github:

Come lo facciamo Quindi, cos'è GitHub Flow?

  • Tutto nel ramo principale è distribuibile
  • Per lavorare su qualcosa di nuovo, crea un ramo descrittivo del master (ad esempio: new-oauth2-scopes)
  • Impegnati in quel ramo localmente e invia regolarmente il tuo lavoro allo stesso ramo sul server
  • Quando hai bisogno di feedback o aiuto o pensi che il ramo sia pronto per l'unione, apri una richiesta pull
  • Dopo che qualcun altro ha esaminato e sottoscritto la funzionalità, puoi unirla in master
  • Una volta che è stato unito e trasferito a "master", puoi e dovresti distribuire immediatamente

Vedi l'intero articolo per maggiori dettagli: http://scottchacon.com/2011/08/31/github-flow.html

Nota che le "richieste pull" sono un'invenzione di Github, ed è qualcosa che viene inserito nel loro sito Web, non Git stesso: https://help.github.com/articles/using-pull-requests/


4
Con un team più piccolo e sviluppatori meno esperti di git, la semplicità di questo flusso di lavoro vince. L'unica cosa che facciamo in modo diverso è avere un ramo di "stadiazione" tra il ramo di funzionalità e il master che funge da sito di QA live per i non sviluppatori affinché accettino la funzionalità in un ambiente di produzione come.
Squadroni

@Squadrons sembra che tu abbia bisogno di schierare polpo per questo, che ha porte integrate per ok / negare build che entrano in ambienti diversi e non inquinano il controllo del codice sorgente con tali cose.
Tim Abell,

La creazione di diramazioni di funzionalità dal master e la successiva fusione per la distribuzione è OK, purché si disponga di un tag in modo da garantire un punto di rollback sicuro. Le distribuzioni non vanno sempre secondo i piani. Se credi nel "solo rollforward" non importa molto quando stai emorragiando denaro.
Rasoio

15

Utilizzare il masterramo come ramo di sviluppo e creare rami di rilascio per eseguire correzioni di errori.

Tutte le nuove funzionalità verranno attivate masterdurante la finestra di sviluppo (impegnate direttamente o come rami di argomenti con richieste pull, fino a te - non mostrate in figura). Una volta implementate tutte le funzionalità pianificate, immettere il blocco delle funzionalità ed eseguire i test. Quando sei felice, tagga il rilascio mastercome v1.0.

Nel corso del tempo i tuoi utenti troveranno dei bug, v1.0quindi ti consigliamo di creare un ramo da quel tag (es. Nominalo dopo il rilascio 1.0) e correggere quei bug nel ramo. Quando hai risolto un numero sufficiente di bug che ritieni che meriti una nuova versione, taggalo come v1.0.1e uniscilo nuovamente master.

Nel frattempo può succedere una nuova finestra di sviluppo sul masterramo che alla fine verrà taggata come v1.1.

Risciacqua e ripeti.

Ciò segue la logica di numerazione della versione semantica .

 ---------(v1.0)--------------------------------(v1.1)-----------------------------> master
             \                                     \  
              ---(v1.0.1)---(v1.0.2)---> 1.0        ---(v1.1.1)---(v1.1.2)---> 1.1

5
Non dimenticare di unire 1.0.1nuovamente le modifiche inmaster
kwahn,

E tieni sempre a mente di rifare 1.1il master dopo l'unione 1.0.1: questo aiuta a ridurre al minimo la confusione.
Nam G VU

@NamGVU Non lo consiglierei. 1.1è un ramo di rilascio e ha tag che rappresentano lo stato esatto di una o più versioni. Rebasing quel ramo ti farebbe perdere quella rappresentazione. Consiglio vivamente di impostare le filiali di rilascio in modo da negare spinte forzate per impedirlo.
Leif Gruenwoldt,

1
No. Non unire nuovamente i rami di rilascio nel master! Può darti tutti i tipi di mal di testa di cui non hai bisogno (unendo le cose di solo rilascio, unendo conflitti con le versioni più recenti, rompendo build, storia non lineare, ecc. Credimi, l'ho visto accadere più di una volta) . Invece, tratta le versioni come forcelle. Vedi bitsnbites.eu/a-stable-mainline-branching-model-for-git
m-bitsnbites il

4
cherry-pick è un'opzione migliore per recuperare le modifiche di rilascio nel master
BartoszKP il

4

In un VCS, avere solo un ramo "master" mostra rapidamente i suoi limiti perché non è possibile proseguire tutti gli sforzi di sviluppo contemporaneamente su un ramo.
Ciò significa che devi sapere quando diramare .

Ma in un DVCS (come nel VCS "decentralizzato"), hai anche un problema di pubblicazione , con filiali che mantieni localmente nei tuoi archivi e filiali da cui stai spingendo o da cui stai spingendo.

In questo contesto, inizia identificando il tuo sforzo di sviluppo simultaneo e decidi su un processo di pubblicazione (push / pull). Ad esempio (e questo non è l'unico modo):

  • prod è una filiale pubblica di sola lettura con il codice in produzione. Tutti potrebbero trarne vantaggio per:
    • rifare il suo sviluppo attuale al di sopra di esso (per i test locali o per l'integrazione nel repository di sviluppo locale un aggiornamento rapido eseguito nel repository di prodotti sul ramo di prodotti)
    • ramo per fare nuove funzionalità (da un codice stabile noto)
    • ramo per avviare il ramo di rilascio successivo (quello che deve essere in produzione)
      nessuno dovrebbe spingere direttamente verso prod (da qui in sola lettura)
  • il rilascio è un ramo di consolidamento in lettura e scrittura, in cui i commit rilevanti vengono selezionati in modo da far parte del rilascio successivo.
    Tutti possono spingere per rilasciare per aggiornare la prossima versione.
    Tutti possono trarre da detta versione per aggiornare il proprio processo di consolidamento locale.
  • featureX è un ramo privato di lettura-scrittura (in quanto non ha bisogno di essere spinto nel repository di prodotti centrale) e può essere spinto / tirato tra i repository di sviluppo. Rappresenta uno sforzo a medio-lungo termine, diverso dallo sviluppatore quotidiano
  • master rappresenta lo sviluppatore corrente e viene spinto / tirato tra i repository di sviluppo.

Esistono altri processi di gestione delle versioni, come attesta questa domanda SO .


3

Leggi il Reinit's Git Workflow per i team Agile qui: http://reinh.com/blog/2009/03/02/a-git-workflow-for-agile-teams.html

Questo funziona molto bene per i piccoli team. L'obiettivo qui è quello di assicurarsi che tutto ciò che potrebbe essere potenzialmente instabile rientri in un ramo di qualche tipo. Unisci nuovamente al master solo quando sei pronto per l'utilizzo da parte di tutti coloro che lavorano al di fuori del ramo delle funzionalità.

Nota: questa strategia non è specifica per git, ma git rende l'implementazione di questa strategia piuttosto semplice.

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.