Explications du workflow Git flow
Auteur: Adem Usta
Publié le 2021-06-13
Qu’est ce que Git Flow et comment l’implémenter ?
Travailler sur un projet git avec plusieurs contributeurs peut être compliqué et confus.
Ou du moins, si aucun workflow n’est utilisé pour l’utilisation de git.
C’est pourquoi un workflow a été conçu par certaines personnes (je ne sais qui) dans le but d’optimiser l’utilisation de git.
Ce workflow s’appelle git flow. Rentrons dans le vif du sujet !
Avertissement
Dans ce tutoriel, il se peut qu’il y ait des changements avec le git flow traditionnel.
Les idées de base sont présentes, n’hésitez pas à comparer cet article avec d’autres sur le web.
Nous avons essayé d’ajouter quelques améliorations, notamment sur le format des messages dans nos commits, en vue de pouvoir simplifier la création de changelog.
Le workflow git flow
Idées générales
Un des concepts les plus impportants est de garder une seule branche pour le déploiement de nouvelles versions en production, et une autre pour accumuler plusieurs nouvelles fonctionnalités avant la création d’une nouvelle version:
master
: branche gardant l’historique de chaque tag de votre code (aussi appeléemain
)develop
: branche sur laquelle on va pousser de nouvelles fonctionnalités en vue d’une nouvelle version
Développement d’une nouvelle fonctionnalité
Prenons un exemple simple: vous développez une nouvelle fonctionnalité. Vous allez donc suivre ces étapes:
Vous partez de la branche
develop
, vous créez une nouvelle branche:git checkout -b feature/my-awesome-feature
Faites votre magie avec le code. Faites autant de commits que vous voulez.
Une fois que votre code est prêt à être testé et relu par vos collègues, ouvrez une Merge / Pull request.
N’hésitez pas à rebase votre branche sur
origin/develop
afin d’être sûr d’avoir les derniers changements.Pour une opération de rebase local:
git fetch -ap && git rebase origin/develop
Après cela, vous avez besoin de push force sur votre repertoire distant (à cause du rebase):
git push -f
Une fois que votre code est testé, a passé votre pipeline d’intégration continu, et est accepté par vos collègues, vous pouvez merge
feature/my-awesome-feature
dansdevelop
.Faites cela via l’UI de votre service Git (GitHub / Gitlab / etc.)
Note: Pour garder un historique propre sur
develop
, choisissez l’optionsquash and merge
lors du merge: il n’y aura qu’un commit surdevelop
.On va vous demander un message pour cet unique commit:
Dans l’idéal, vous pouvez utiliser ce format:
type(scope): my commit message
.Avec:
type
une des valeurs suivantes:feat,fix,docs,breaking,build,ci,misc,refactor,style,test
scope
peut être n’importe quel mot.
D’autres formats existent et peuvent être utilisés.
L’idée derrière ce format, vous allez le voir plus tard, est de pouvoir les parser et créer des changelogs automatiquement.
Mais cela ne fait pas partie du workflow traditionnel. Vous pouvez donc faire ce que vous voulez.
Préparation d’une nouvelle version
Vous avez développé plusieurs fonctionnalités que vous estimez être prêts pour une mise en production, l’idée est de suivre ces étapes:
Créer une banche
release/vx.x.x
partant dedevelop
Si vous avez des tests d’intégration, appliquez les sur cette branche
S’il y a des bugs sur cette branche, vous pouvez les fix sur celle-ci
Une fois que c’est prêt, vous pouvez merge sur
master
.Note: dans le workflow traditionnel, le merge sur
master
se fait en faisant un squash. Mais, comme dit plus haut, nous avons décidé de modifier un peu ce workflow. L’idée est de garder les commits venant dedevelop
surmaster
. Un merge commit peut être présent et aussi simple quevX.X.X
. Garder les commits formattés surmaster
va nous aider plus tard pour créer les changelogs d’une release à l’autre. On le verra plus tard dans l’article.Créez une nouvelle version (avec un nouveau tag).
N’oubliez pas de rebase
develop
surmaster
afin de garder le même historique.develop
doit être au courant de ce qu’il y a surmaster
. Toujours en avance.
Développement de hotfix
Parfois (pour ne pas dire tout le temps …), il y a des bugs sur la nouvelle version de votre code.
Certains bugs peuvent attendre la prochaine version pour être corrigés, mais d’autres non.
Ces bugs doivent être corrigés au plus vite. Git flow a un plan de bataille pour ce cas de figure:
Créez une branche partant de
master
:hotfix/my-hotfix
par exempleCorrigez le bug
Testez le hotfix:
- La correction est effective
- Pas de regression dans le code
Une fois que le fix est testé et approuvé, mergez sur
master
avec un squash.Le message de commit doit être explicite, il peut ressembler à cela:
hotfix(scope): fix critical vx.x.x
Créez votre nouveau tag.
Rebase
develop
surmaster
pour garder un historique complet surdevelop
.
Notes importantes
A chaque changement sur
master
, ne pas oublier de rebasedevelop
surmaster
:git fetch -ap && git rebase origin/master
etgit push -f origin/develop
De même pour les branches qui partent de
develop
, quand celle-ci a changé:git fetch -ap && git rebase origin/develop
etgit push -f origin/feature/my-awesome-feature
Appendix 1: git flow
, un package permettant d’implémenter ce workflow facilement
En lisant de la documentation sur git flow, je peux comprendre que cela puisse paraître fastidieux et difficile à maintenir sur le long terme.
C’est pourquoi il existe un plugin à git qui permet de simplifier l’utilisation de ce workflow: git flow
.
Personnellement je ne l’utilise pas car je suis habitué à ce workflow depuis quelques années maintenant.
Mais si vous le souhaitez, allez regardez la documentation de cet outil https://github.com/nvie/gitflow et commencez à l’utiliser !
Appendix 2: Créez des changelogs automatiquement entre chaque nouvelle version de votre code
Dans cet article, j’ai inclus quelques améliorations par dessus le git flow traditionnel.
Le principal étant d’avoir un format commun de message pour les commits.
Si vous choisissez de suivre ces indications, vous pourrez créer vos changelogs facilement.
Pour cela, vous devez installer un petit binaire appelé git-chlog
.
Vous pouvez le trouver ici https://github.com/git-chglog/git-chglog
Je ne vais pas faire un tutoriel complet sur son utilisation, mais vous pouvez aller lire la documentation pour en comprendre l’utililité.
Je vais juste vous partager un exemple d’utilisation pour conclure sur cet article:
Vous avez une nouvelle version de votre code: v1.1.0
.
Le tag précédent était v1.0.7
. Vous voulez créer un changelog entre ces deux tags.
Vous pouvez simplement executer: git-chlog v1.1.0..
pour avoir la liste des commits parsés dans cette dernière version.
Si vous voulez un changelog complet: git-chlog
simplement.
Aussi simple que cela !
Conclusions
Dans cet article j’ai voulu vous expliquer comment avoir un workflow git propre, permettant à vous et votre équipe d’optimiser votre temps et de se concentrer sur le plus important: le code.
J’espère que ce tutoriel vous aidera à comprendre ce qu’est git flow !
Je vous partage deux liens qui m’ont aidé à écrire cet article:
- Toptal: enhanced git flow explained
- The gitflow workflow - in less than 5 mins (du youtuber
DevChild
)
A plus tard,
Adem.