Dovresti guardare git-flow . È un modello di ramificazione eccellente (e popolare).
Riepilogo Git Flow
branching
I tronchi principali che rimangono in giro per sempre sono develop
e master
. master
contiene l'ultima versione e develop
contiene l'ultima copia di sviluppo "stabile".
I collaboratori creano feature
filiali (con prefisso feature/
per convenzione) da develop
:
$ git checkout -b feature/my-feature develop
e hotfix
filiali (precedute da hotfix/
per convenzione) al di fuori 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", nel senso che hanno una breve durata prima di essere ricongiunti ai tronchi principali. Hanno lo scopo di incapsulare piccoli pezzi di funzionalità.
Filiali di finitura
Quando un contributore ha terminato un feature
ramo, lo ricollegano in develop
:
$ git checkout develop
$ git merge --no-ff feature/my-feature
$ git branch -d feature/my-feature
Quando hanno finito con un hotfix
ramo, lo uniscono nuovamente in entrambi 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 di integrazione continua.
Uscite
Quando sei pronto per iniziare a creare un rilascio, crei un release
ramo dal tuo ramo "stabile" develop
(lo stesso della creazione di feature
rami). Quindi si esegue il bump del numero di versione in un tag (descritto di seguito).
L'uso di release
rami separati ti consente di continuare a sviluppare nuove funzionalità develop
mentre correggi i bug e aggiungi tocchi finali al release
ramo.
Quando sei pronto per terminare il rilascio, unisci il release
ramo in entrambi master
e develop
(proprio come a hotfix
) in modo che tutte le modifiche proseguano.
Tagging
Quando si crea un release
ramo o un hotfix
ramo, il numero di versione viene sommato in modo appropriato in un tag. Con Vanilla Git, è così:
$ git tag -a <tag-name> -m <tag-description>
Dovrai quindi anche inviare i tag (separatamente) al tuo repository remoto:
$ git push --tags
Di solito è meglio usare il versioning semantico in cui le tue versioni prendono la forma major.minor.hotfix
. I dossi principali sono incompatibili all'indietro, mentre i dossi minori e gli hotfix non sono incompatibili all'indietro (a meno che non siate in beta, 0.x.x
).
Fusione
Come hai visto sopra, git-flow ti incoraggia a unire i rami con il seguente comando:
$ git merge --no-ff <branch-name>
L' --no-ff
opzione ti consente di mantenere tutta la cronologia dei tuoi rami senza lasciare un mucchio di rami nell'attuale commit del repository (quindi non preoccuparti, non avrai un ramo per ogni versione).
Sei anche incoraggiato a tirare avanti
$ git pull --rebase
Quindi non aggiungi molti inutili commit di unione.
Puoi configurare git per fare entrambe queste cose di default nel tuo .gitconfig
. Ti lascio comunque cercare quello;)
Versioni di navigazione
Quando qualcuno cerca una versione specifica del tuo codebase, può controllare il 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 "rami".
Utilizzo dell'estensione git-flow (consigliata)
Il mio modo preferito di usare 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 Louis.)
L'estensione automatizza tutte le parti disordinate (come l'utilizzo merge --no-ff
e l'eliminazione di rami dopo l'unione) in modo da poter andare avanti con la tua vita.
Ad esempio, con l'estensione, è possibile 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 gli aggiornamenti rapidi e le versioni sono simili, sebbene utilizzino 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 crea quindi il tag di versione per te e ti ricorda gentilmente di salvare la versione in qualsiasi file di configurazione o manifest (cosa che potresti fare con un task manager come grunt).
Spero che sia d'aiuto :) Non sono sicuro di come integreresti tutto con la tua configurazione di Travis CI, ma immagino che Githooks ti porterà lì.