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 develope master. mastercontiene l'ultima versione e developcontiene l'ultima copia di sviluppo "stabile".
I collaboratori creano featurefiliali (con prefisso feature/per convenzione) da develop :
$ git checkout -b feature/my-feature develop
e hotfixfiliali (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 featureramo, 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 hotfixramo, lo uniscono nuovamente in entrambi mastere developquindi 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 releaseramo dal tuo ramo "stabile" develop(lo stesso della creazione di featurerami). Quindi si esegue il bump del numero di versione in un tag (descritto di seguito).
L'uso di releaserami separati ti consente di continuare a sviluppare nuove funzionalità developmentre correggi i bug e aggiungi tocchi finali al releaseramo.
Quando sei pronto per terminare il rilascio, unisci il releaseramo in entrambi mastere develop(proprio come a hotfix) in modo che tutte le modifiche proseguano.
Tagging
Quando si crea un releaseramo o un hotfixramo, 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-ffopzione 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 describee potrebbe essere più attivo ora. Grazie Louis.)
L'estensione automatizza tutte le parti disordinate (come l'utilizzo merge --no-ffe 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ì.