vmontagn.fr

devblog

Bien gerer son (work)flow avec git



Retrouvez l’article sur le blog de Code Insider:

https://blog.codeinsider.fr/gerer-son-worklfow-avec-git/

Mise à part le fait d’être un hébergement meublé touristique ou un morceaux de viande de boeuf situé dans la cuisse, Git est un outil de versionning décentralisé et libre de droit créé par Linus torvald, l’auteur du tout petit noyau de système d’exploitation répondant au doux nom de Linux. Utilisé par plus de douze millions de personnes à travers le monde, Git est le logiciel de gestion de version le plus populaire sur la Terre. En 2017, Microsoft quitte le bon vieux Apache Subversion, aka SVN pour migrer le code de Windows vers Git. Microsoft renforce son lien avec Git en rachetant, en juin 2018, le site Github (à ne pas confondre avec le site: http://guthib.com/) pour la modique somme de 7.5 Milliard de dollars.

Mais comment bien gérer son système de branche ? Voici une sélection de différente manière de gérer (plus ou moins bien) ses branches. Il est conseillée de connaître le fonctionnement de Git avant de lire cet article.

Pour les néophytes, la documentation officiel est bien écrite : https://git-scm.com/book/fr/v1/Les-bases-de-Git

NoFlow aka “Utiliser Git comme SVN”:

Cette méthode est la plus simple puisqu’il suffit de publier son travail sur la seul et unique branche existante par défaut : la branche master.

Cette méthode est principalement utilisée par les développeurs solo afin de versionner leur code.

no-flow
[image : http://blog.programster.org/git-workflows]

L’image ci-dessous est la représentation réaliste d’un chef de projet ne connaissant pas la puissance de Git :
lol

GitFlow aka “La machine de guerre” :

Le principe de GitFlow est de fonctionner sur deux branches principales : la branche de développement (develop) et la branche de production (master).

Chaque nouvelle modification du projet doit être faite via des sous-branches, aux nombres de trois, qui sont ensuite fusionnées aux branches principales :

Pour ajouter des nouvelles fonctionnalités, il faut créer une branche “feature”, elle sera ajoutée à la branche develop ou à une branche de release.

Si on souhaite fixer une erreur sur la branche master, il faut créer une nouvelle branche "hotfix”. Cette dernière sera fusionnée sur les deux branches principales.

Dès que l’on souhaite créer une release, on créé une branche “release” qui sert de branche principale aux nouvelles fonctionnalités de cette dernière. Lorsque la release arrive en production, les commits de cette branche sont rajoutés à la branche master ainsi qu’à la branche develop pour permettre de continuer aisément le développement de nos fonctionnalités sans problème majeur lors de futurs fusions de branches.

La convention de nommage des sous-branches consiste à les nommer selon leur fonctionnalité première (“feature”, “hotfix”, “release”) suivis du numéro du ticket, ou son nom, ou sa fonctionnalité, etc. (example: “feature-1”)

Il existe un outil permettant d’utiliser ce workflow plus facilement : https://github.com/nvie/gitflow

git-flow
[image : https://medium.com/devsondevs/gitflow-workflow-continuous-integration-continuous-delivery-7f4643abb64f]

OneFlow aka “Git Flow sur une branche principale” :

Le principe de fonctionnement de Oneflow est une amélioration de Git Flow, le changement majeur est qu’il n’existe pas de branche develop.

Le principal avantage est d’avoir un historique git plus propre tout en conservant ceux de Git Flow.

one-flow
[image : https://commons.wikimedia.org/wiki/File:OneFlow_Example.png]

Gitlab Flow aka “Ma Pre-production contient precisement ces commits” :

A l’inverse de tous les autres workflow, GitLab Flow a sa propre branche de production dont le dernier commit sur cette fameuse branche est la version actuelle du service, GitFlow est lui aussi est basé sur trois branches principales :

-> La branche master, qui représente l’environnement de développement
-> La branche staging, qui représente le contenu de la version de pré-production
-> La branche production, qui est la version publie sur les serveurs de production

L’avantage d’utiliser ce workflow est qu’il est facilement possible de savoir les commits utilisés dans chaque environnement.

gitlab-flow
[image : http://blog.programster.org/git-workflows]

GitHub Flow aka ”Qui peut mettre en prod mon code ?” :

Le site Github implémente le système de Pull Request en 2008. Cette ajout fut une révolution pour les projet open-source, permettant à un utilisateur de pouvoir fusionner son code dans une autre branche à la suite d’une validation manuelle d’un ou plusieurs personnes.

Github Flow place au coeur de son workflow le Pull Request. Le développeur crée une nouvelle branche sur laquelle il va faire ses modifications. Après avoir fini son développement, le développeur crée une pull request. Tant que la demande n’as pas été validée par l’équipe, le développeur peut modifier son code. Si l’équipe valide la modification, cette dernière est fusionnée au code principal. La branche principal du projet est donc fonctionnel et livrable en production.

Cette méthode est principalement utilisée sur des projets avec de petites équipes.

github-flow
[image : https://hackernoon.com/15-tips-to-enhance-your-github-flow-6af7ceb0d8a3]

Trunk Based Development aka “Tout sur master”:

La différence majeur, entre le trunk-based et Github Flow, est que la branche master n’est pas considérée comme utilisable en production. Toutes les fonctionnalités sont ajoutées à la branche principale, et seuls les commits de corrections sont ajoutés à la branche de release (après avoir été ajoutés au trunk).
Cette pratique permet d’éviter d’avoir des conflits de merge et de permettre d’avoir un programme toujours compilable et fonctionnel.

trunk-based
[image : https://paulhammant.com/2013/04/05/what-is-trunk-based-development/]

Conclusion

Pour conclure, hormis la première méthode, toutes sont conseillées pour un travail avec plusieurs collaborateurs, chacune étant adaptée pour un besoin. Il faut donc prendre le temps de les tester pour trouver la plus convenable pour son projet. Pour ma part, j’utilise “No Flow” sur mes projets personnels, “GitHub Flow” pour les projets en petite équipe et “GitFlow” en entreprise, même si je sais pertinemment que l’on a pas besoin d’un workflow aussi important, il est plus facile de faire de l'intégration continue dessus.

Un autre point intéressant qui fera l’objet d’un article dans un futur proche : la convention de nommage de ses commits et son importance lors de son traçage dans l’historique du projet.