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 develop
et master
. master
contient votre dernière version et develop
contient votre dernière copie de développement "stable".
Les contributeurs créent des feature
succursales (préfixées feature/
par convention) à partir de develop
:
$ git checkout -b feature/my-feature develop
et hotfix
branches (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 feature
branche, 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 hotfix
branche, ils la fusionnent à nouveau dans les deux master
et develop
donc 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 release
branche à partir de votre branche "stable" develop
(identique à la création de feature
branches). Vous cognez ensuite le numéro de version dans une balise (décrite ci-dessous).
L'utilisation de release
branches distinctes vous permet de continuer à développer de nouvelles fonctionnalités pendant develop
que vous corrigez des bogues et ajoutez des touches finales à la release
branche.
Lorsque vous êtes prêt à terminer la version, vous fusionnez la release
branche dans les deux master
et develop
(tout comme a hotfix
) afin que toutes vos modifications soient reportées.
Marquage
Lorsque vous créez une release
branche ou une hotfix
branche, 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-ff
option 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 describe
et pourrait être plus active maintenant. Merci Louis.)
L'extension automatise toutes les parties en désordre (comme l'utilisation merge --no-ff
et 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.