Come utilizzare github, rami e rilasci automatici per la gestione delle versioni? [chiuso]

24

Comprendo ormai gran parte dei concetti Git / Github di base, tuttavia ho ancora difficoltà a comprendere l'immagine più grande.

Queste sono alcune cose su cui sono riuscito a lavorare fino ad ora:

  • Push commit
  • Lavora con i rami
  • Integrazione di Github con Travis CI, un sistema di integrazione continua
  • Via Travis CI, crea automaticamente su ogni commit da masterizzare e metti il rilascio sotto forma di ZIP su Github nelle versioni.

Tuttavia, finora ho lavorato solo sulle versioni alpha / beta dei progetti, quindi non ho mai visto le versioni con versioni ancora in pratica.

Quindi voglio saperne di più sul controllo delle versioni, mantenendo versioni separate, hotfix delle versioni, ecc.

Come farò in modo che le seguenti cose accadano:

  • Hanno diverse versioni del mio progetto, ad esempio versione 1.1.0 e 2.0.0
  • Avere la possibilità di inviare hotfix sulle versioni, eseguire il bump della versione su 1.1.1 o 2.0.1, ecc.
  • Crea un sistema di integrazione continua, crea automaticamente quella versione su commit e, se ce la fai, pubblica una versione per quella versione specifica.

Dubito tra le seguenti opzioni:

  • Devo usare i tag per ogni versione? In tal caso, in che modo un sistema di integrazione continua può generare automaticamente versioni?
  • Devo creare rami per ogni versione? In tal caso, se non si crea un'intera tonnellata di rami (come un ramo 1.1 e 2.0, gli aggiornamenti rapidi avvengono su quel ramo ovviamente)
  • Come specificare il numero di versione? Va bene avere un file di configurazione che specifica il numero di versione o ci sono modi più intelligenti attorno ad esso? In questo caso sarebbe un progetto Java, se questo è importante.
posta skiwi 04.09.2014 - 22:11
fonte

4 risposte

41

Dovresti dare un'occhiata a git-flow . È un eccellente (e popolare) modello di ramificazione.

Riepilogo del flusso Git

Branching

I tronchi principali che restano per sempre sono develop e master . master contiene la tua ultima versione e develop contiene la tua ultima copia di sviluppo "stabile".

Collaboratori creano feature rami (prefissati con feature/ per convenzione) su develop :

$ git checkout -b feature/my-feature develop

e hotfix rami (prefissati con hotfix/ per convenzione) off di master :

# hotfix the latest version of master
$ git checkout -b hotfix/hotfix-version-number master

# or hotfix from a specific version
$ git checkout -b hotfix/hotfix-version-number <starting-tag-name>

Questi rami sono "usa e getta", il che significa che hanno una breve durata prima di essere uniti ai tronchi principali. Sono pensati per incapsulare piccoli pezzi di funzionalità.

Rami di finitura

Quando un contributore ha finito con un ramo feature , lo uniscono nuovamente a develop :

$ git checkout develop
$ git merge --no-ff feature/my-feature
$ git branch -d feature/my-feature

Quando hanno finito con un ramo hotfix , lo uniscono nuovamente in master e develop , quindi l'aggiornamento rapido prosegue:

$ git checkout master
$ git merge --no-ff hotfix/hotfix-version-number
$ git checkout develop
$ git merge --no-ff hotfix/hotfix-version-number
$ git branch -d hotfix/hotfix-version-number

Questo è l'aspetto dell'integrazione continua.

Comunicati

Quando sei pronto per iniziare il confezionamento di un rilascio, crei un ramo release dal tuo ramo "%" develop (uguale a creare feature rami). Quindi si esegue il bump del numero di versione in un tag (descritto di seguito).

L'utilizzo di filiali release separate ti consente di continuare a sviluppare nuove funzionalità su develop mentre correggi bug e aggiungi ritocchi finali al ramo release .

Quando sei pronto per completare il rilascio, unisci il ramo release in master e develop (proprio come hotfix ) in modo che tutte le modifiche vengano portate avanti.

Tagging

Quando crei un ramo release o un ramo hotfix , esegui il bump del numero di versione in modo appropriato in un tag. Con van git, assomiglia a questo:

$ git tag -a <tag-name> -m <tag-description>

Dovrai poi inserire i tag (separatamente) nel tuo repository remoto:

$ git push --tags

Di solito è meglio usare versioning semantico in cui le tue versioni assumono il formato major.minor.hotfix . I dossi principali sono incompatibili all'indietro, mentre quelli secondari e quelli con hotfix non sono incompatibili all'indietro (a meno che tu non sia in beta, 0.x.x ).

La fusione

Come hai visto sopra, git-flow ti incoraggia a unire rami con il seguente comando:

$ git merge --no-ff <branch-name>

L'opzione --no-ff ti consente di conservare tutta la cronologia del tuo ramo senza lasciare un mucchio di rami nel commit corrente del repository (quindi non preoccuparti, non avrai un ramo per ogni versione).

Sei anche incoraggiato a tirare con

$ git pull --rebase

Quindi non aggiungi molti commit inutili di fusione.

Puoi configurare git per fare entrambe queste cose per impostazione predefinita in .gitconfig . Ti lascerò comunque vedere quello;)

Versioni di navigazione

Quando qualcuno sta cercando una versione specifica della tua base di codice, può eseguire il checkout del tag per nome:

# checkout in detached HEAD to browse
$ git checkout <tag-name>

# OR checkout and create a new local branch (as you might for a hotfix)
$ git checkout -b <new-branch-name> <tag-name>

Oppure, se qualcuno sta navigando su github, c'è anche una scheda "tag" nel menu a discesa "branches".

Uso dell'estensione git-flow (consigliato)

Il mio modo preferito per utilizzare questo modello è con l'estensione git flow per git.

( Modifica: Louis ha raccomandato il fork AVH che funziona meglio con git describe e potrebbe essere più attivo ora. Grazie Luigi.)

L'estensione automatizza tutte le parti disordinate (come l'utilizzo di merge --no-ff e l'eliminazione di rami dopo l'unione) in modo che tu possa andare avanti con la tua vita.

Ad esempio, con l'estensione, puoi creare un ramo di funzionalità in questo modo:

$ git flow feature start my-feature-name

e finisci così

$ git flow feature finish my-feature-name

I comandi per hotfix e release sono simili, anche se usano il numero di versione al posto del nome di un ramo, in questo modo:

# Create hotfix number 14 for this minor version.
$ git flow hotfix start 2.4.14

# Create the next release
$ git flow release start 2.5.0

Git flow quindi crea il tag della versione per te e ti ricorda gentilmente di eseguire il bump della versione in qualsiasi file di configurazione o manifest (cosa che potresti fare con un task manager come grunt).

Spero di esserti stato utile :) Non sono sicuro di come integreresti tutto con il tuo setup di Travis CI, ma suppongo che i githook ti porteranno lì.

    
risposta data 04.09.2014 - 23:53
fonte
3

Devo usare un tag per ogni versione?

No, non è necessario per usare i tag. Se vuoi taggare ogni versione, va bene, o se vuoi taggare ogni volta che il tuo sistema CI si costruisce, puoi farlo anche tu. I tag stanno essenzialmente dando un nome user-friendly al commit, in modo da poterlo facilmente visualizzare e visualizzarlo in un secondo momento.

Devo creare filiali per ogni versione?

Certo! Branching è economico / gratuito in Git, quindi ne approfitto ogni volta che ne ho l'occasione. Puoi anche unire ed eliminare i rami abbastanza velocemente. Se senti di avere molti rami, puoi sempre abbatterli più tardi con un po 'di fusione selettiva. Sono disponibili anche molti schemi di ramificazione Git se si desidera utilizzare uno schema provato e vero.

Come dovrei specificare il numero di versione?

I tag di solito sono il modo in cui si specifica il numero di versione, in quanto riguarda git. Se stai parlando della versione di un progetto, o del modo migliore per farlo, dovrai fare un po 'di ricerca, dato che si tratta di una domanda abbastanza basata sull'opinione pubblica. Alcuni progetti rimangono in Beta per sempre, altri incrementano versioni di numeri interi come se fossero fuori moda (Guardando a te chrome)

    
risposta data 04.09.2014 - 23:14
fonte
3

Do I need to use tags for every version?

Se per "versione" si intende un insieme di file che costituiscono un rilascio o un candidato alla versione, allora consiglio vivamente di codificare ogni versione. Se hai bisogno di fare riferimento alla versione 1.2.7 in fondo alla strada, vuoi cercare l'hash di un commit o semplicemente utilizzare il numero di versione?

Inoltre, se utilizzi git describe per registrare le informazioni di compilazione da qualche parte (come faccio io), l'uso dei tag consente di fornire un output molto più bello.

If so, how can a continuous integration system build releases automatically?

Un sistema di integrazione continua potrebbe creare versioni indipendentemente dall'uso dei tag. Si potrebbe dire di costruire un rilascio sulla base dell'hash di un commit. I tag ti semplificano la vita.

Should I create branches for every version? If so, would that not create a whole ton of branches (like an 1.1 and a 2.0 branch, hotfixes go onto that branch of course)

Non vedo la ramificazione come una cosa "per versione". Ho un paio di progetti in cui le mie versioni sono tutte commesse sul ramo master . Non ho bisogno di qualcosa di più complicato di questo per ora perché nessuno dei due progetti è stabile e non è necessario supportare le versioni precedenti a lungo termine. Ma diciamo che rilascio 1.0, 1.1, 1.2, quindi rilascio 2.0 e devo ancora supportare la serie 1.0 con correzioni di sicurezza, ecc. Quindi avrei sicuramente un ramo per inserire le versioni di manutenzione per la serie 1.x. .

How would I specify the version number? Is it okay to have a configuration file that specifies the version number, or are there smarter ways around it? In this case it would be a Java project, if that matters.

Avere un'unica fonte per il proprio numero di versione, come un file di configurazione, è il modo migliore in quanto previene gli errori fat finger che potrebbero altrimenti verificarsi se è necessario aggiornare i numeri in un numero di punti. Sto parlando da ... hmm ... esperienza imbarazzante. Rilasciate 1.3 solo per scoprire che il software riporta ancora che è la versione 1.2. Oops!

In un'altra risposta, mxdubois ti ha consigliato gitflow. Se decidi di utilizzare gitflow, ti consigliamo di utilizzare la edizione AVH . La versione originale non viene più mantenuta attivamente. Una differenza degna di nota è che l'edizione AVH esegue fusioni di rilascio che consentono a git describe di funzionare in modo intelligente. La versione originale esegue l'unione in modo che viaggi git describe .

    
risposta data 05.09.2014 - 01:47
fonte
0

Scansione del tuo elenco Vedo la versione come tuo obiettivo, quindi ...

Un modo per mantenere le versioni è con i rami e l'unione (o la ridefinizione).

Quindi hai:

master

quindi crei un ramo

v1

quindi aggiungi altre modifiche a

master(diff1)

quindi crei un ramo

v3

quindi aggiungi altre modifiche a

master(diff2)

Ora:

Per aggiornare la versione 2 ora fai

git checkout v2
git merge master  # for the changes you want to bring into version 2
# rebasing is also an option
# resolve any merge conflicts
# Done.

Per aggiornare la versione 3

git checkout v3
git merge master

Quanto sopra è per gli aggiornamenti all'ingrosso.

Probabilmente è più probabile che tu voglia selezionare le modifiche specifiche per quello che c'è

git cherry-pick

Altro su cherry picking al link

    
risposta data 04.09.2014 - 23:22
fonte

Leggi altre domande sui tag