Vous devriez regarder git-flow . C'est un excellent modèle de branchement (et populaire).
Résumé de Git Flow
Ramification
Les principaux troncs qui restent pour toujours sont developet master. mastercontient votre dernière version et developcontient votre dernière copie de développement "stable".
Les contributeurs créent des featuresuccursales (préfixées feature/par convention) à partir de develop :
$ git checkout -b feature/my-feature develop
et hotfixbranches (préfixées hotfix/par convention) à partir de 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>
Ces branches sont "jetables", ce qui signifie qu'elles ont une courte durée de vie avant d'être fusionnées avec les troncs principaux. Ils sont destinés à encapsuler de petites fonctionnalités.
Branches de finition
Lorsqu'un contributeur a terminé avec une featurebranche, il la fusionne à nouveau dans develop:
$ git checkout develop
$ git merge --no-ff feature/my-feature
$ git branch -d feature/my-feature
Lorsqu'ils ont terminé avec une hotfixbranche, ils la fusionnent à nouveau dans les deux masteret developdonc le correctif se poursuit:
$ 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
C'est l'aspect d'intégration continue.
Communiqués
Lorsque vous êtes prêt à commencer à empaqueter une version, vous créez une releasebranche à partir de votre branche "stable" develop(identique à la création de featurebranches). Vous cognez ensuite le numéro de version dans une balise (décrite ci-dessous).
L'utilisation de releasebranches distinctes vous permet de continuer à développer de nouvelles fonctionnalités pendant developque vous corrigez des bogues et ajoutez des touches finales à la releasebranche.
Lorsque vous êtes prêt à terminer la version, vous fusionnez la releasebranche dans les deux masteret develop(tout comme a hotfix) afin que toutes vos modifications soient reportées.
Marquage
Lorsque vous créez une releasebranche ou une hotfixbranche, vous transférez le numéro de version de manière appropriée dans une balise. Avec vanilla git, cela ressemble à ceci:
$ git tag -a <tag-name> -m <tag-description>
Vous devrez ensuite également pousser les balises (séparément) vers votre référentiel distant:
$ git push --tags
Il est généralement préférable d'utiliser le versionnage sémantique dans lequel vos versions prennent la forme major.minor.hotfix. Les bosses majeures sont incompatibles en arrière, alors que les bosses mineures et correctives ne sont pas incompatibles en arrière (sauf si vous êtes en version bêta 0.x.x).
Fusion
Comme vous l'avez vu ci-dessus, git-flow vous encourage à fusionner les branches avec la commande suivante:
$ git merge --no-ff <branch-name>
L' --no-ffoption vous permet de conserver l'intégralité de votre historique de branche sans laisser un tas de branches traîner dans le commit actuel du référentiel (donc pas de soucis, vous n'aurez pas de branche pour chaque version).
Vous êtes également encouragé à tirer avec
$ git pull --rebase
Donc, vous n'ajoutez pas beaucoup de commits de fusion inutiles.
Vous pouvez configurer git pour faire ces deux choses par défaut dans votre .gitconfig. Je vous laisse le chercher cependant;)
Parcourir les versions
Lorsque quelqu'un recherche une version spécifique de votre base de code, il peut extraire la balise par son nom:
# 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>
Ou, si quelqu'un navigue sur github, il y a aussi un onglet "tags" dans la liste déroulante "branches".
Utilisation de l'extension git-flow (recommandé)
Ma façon préférée d'utiliser ce modèle est avec l' extension git flow pour git.
( Edit: Louis a recommandé la fourche AVH qui fonctionne mieux avec git describeet pourrait être plus active maintenant. Merci Louis.)
L'extension automatise toutes les parties en désordre (comme l'utilisation merge --no-ffet la suppression de branches après la fusion) afin que vous puissiez continuer votre vie.
Par exemple, avec l'extension, vous pouvez créer une branche d'entité comme ceci:
$ git flow feature start my-feature-name
et finir comme ça
$ git flow feature finish my-feature-name
Les commandes pour les correctifs et les versions sont similaires, bien qu'elles utilisent le numéro de version à la place d'un nom de branche, comme ceci:
# 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 crée ensuite la balise de version pour vous et vous rappelle gentiment de bump la version dans n'importe quelle configuration ou fichier manifeste (ce que vous pourriez faire avec un gestionnaire de tâches comme grunt).
J'espère que cela vous aidera :) Je ne sais pas exactement comment vous intégreriez tout cela avec votre configuration Travis CI, mais je suppose que les githooks vous y mèneront.