GitFlow : le modèle de gestion de branches
GitFlow
Qu'est-ce que GitFlow ?
GitFlow est un modèle de gestion de branches pour Git, introduit par Vincent Driessen en 2010. Ce workflow définit un ensemble strict de règles pour la création et la fusion des branches, permettant de gérer efficacement le cycle de développement des logiciels, particulièrement pour les projets ayant des cycles de publication planifiés.
GitFlow s'articule autour de deux branches principales (master et develop) et de trois types de branches auxiliaires (feature, release et hotfix), chacune ayant un rôle spécifique dans le processus de développement.
Différents types de branches dans GitFlow
Branches principales
Master (main) : Représente le code en production. Chaque commit dans cette branche correspond à une nouvelle version en production.
Develop : Branche d'intégration continue où convergent toutes les fonctionnalités développées. Elle contient la dernière version de développement.
Branches auxiliaires
Feature : Créée à partir de
develop
pour développer une nouvelle fonctionnalité. Une fois terminée, elle est fusionnée dansdevelop
.Release : Créée à partir de
develop
pour préparer une nouvelle version. Permet de finaliser la version (corrections mineures, documentation) avant le déploiement.Hotfix : Créée à partir de
master
pour corriger rapidement un bug critique en production. Une fois résolue, elle est fusionnée dansmaster
etdevelop
.
Flux de travail avec GitFlow
Développement d'une fonctionnalité
1. Création d'une branche feature à partir de develop
git checkout -b feature/nouvelle-fonctionnalite develop
2. Développement de la fonctionnalité
[travail, commits, etc.]
3. Fusion dans develop
git checkout develop
git merge --no-ff feature/nouvelle-fonctionnalite
4. Suppression de la branche feature
git branch -d feature/nouvelle-fonctionnalite
Préparation d'une release
1. Création d'une branche release à partir de develop
git checkout -b release/1.0.0 develop
2. Corrections mineures et préparation
[corrections, documentation, etc.]
3. Fusion dans master et tagging
git checkout master
git merge --no-ff release/1.0.0
git tag -a 1.0.0 -m "Version 1.0.0"
4. Fusion dans develop
git checkout develop
git merge --no-ff release/1.0.0
5. Suppression de la branche release
git branch -d release/1.0.0
Correction d'un bug critique en production
1. Création d'une branche hotfix à partir de master
git checkout -b hotfix/1.0.1 master
2. Correction du bug
[correction, tests, etc.]
3. Fusion dans master et tagging
git checkout master
git merge --no-ff hotfix/1.0.1
git tag -a 1.0.1 -m "Version 1.0.1"
4. Fusion dans develop
git checkout develop
git merge --no-ff hotfix/1.0.1
5. Suppression de la branche hotfix
git branch -d hotfix/1.0.1
Représentation visuelle de GitFlow
(hotfix/1.0.1) → o → o → o → → → → → → → → → → → →
↓ ↓
master o → → → → → → → o → → → → → → → → → → → → → → → → o
↑ ↑ ↑
↑ ↑ (release/1.0.0) ↑
↑ o → o → o → → ↑
↑ ↑ ↓ ↑
↑ ↑ ↓ ↑
develop o → o → o → o → o → → → → → o → o → o → o → o → → o
↑ ↑ ↑
↑ ↑ ↑
(feature/A) ↑ (feature/C)
o → o o o → o → o
↑
↑
(feature/B)
o → o
Implémentation avec l'extension git-flow
L'extension git-flow facilite l'utilisation de ce modèle en automatisant les opérations courantes.
Installation
# Sur macOS avec Homebrew
# Sur Linux (Debian/Ubuntu)
Initialisation
# Dans un dépôt Git existant
Commandes principales
# Démarrer une fonctionnalité
# Finaliser une fonctionnalité
# Démarrer une release
# Finaliser une release
# Démarrer un hotfix
# Finaliser un hotfix
Avantages de GitFlow
- Structure claire : Organisation rigoureuse qui facilite la compréhension du flux de développement.
- Isolation des fonctionnalités : Chaque fonctionnalité est développée dans sa propre branche, minimisant les interférences.
- Support des releases parallèles : Possibilité de maintenir plusieurs versions en production.
- Travail en équipe facilité : La séparation des préoccupations permet à plusieurs équipes de travailler sans conflit.
- Historique de commits propre : L'utilisation de
--no-ff
préserve l'historique des branches.
Inconvénients de GitFlow
- Complexité : Le modèle peut être trop complexe pour des petits projets ou des équipes réduites.
- Overhead administratif : La gestion des branches et des fusions ajoute une charge de travail.
- Moins adapté au déploiement continu : Le modèle est conçu pour des cycles de release planifiés, pas pour du déploiement plusieurs fois par jour.
- Risque de divergence : Les branches à longue durée de vie peuvent diverger significativement, rendant les fusions difficiles.
- Courbe d'apprentissage : Nécessite une compréhension approfondie pour les nouveaux membres de l'équipe.
Comparaison avec d'autres modèles
GitFlow vs GitHub Flow
GitHub Flow est plus simple :
- Une seule branche principale (main)
- Des branches de fonctionnalités créées à partir de main
- Pull requests pour fusionner les changements
- Déploiement après chaque fusion dans main
Idéal pour : déploiement continu, équipes plus petites, applications web.
GitFlow vs Trunk-Based Development
Trunk-Based Development :
- Une seule branche principale (trunk ou main)
- Intégration continue et fréquente (plusieurs fois par jour)
- Utilisation de feature flags pour désactiver le code incomplet
- Branches très courtes (quelques heures maximum)
Idéal pour : équipes pratiquant l'intégration continue/déploiement continu (CI/CD).
Cas d'utilisation appropriés pour GitFlow
GitFlow est particulièrement adapté pour :
- Logiciels avec versions numérotées : Applications de bureau, bibliothèques, frameworks.
- Équipes importantes : Projets impliquant plusieurs équipes travaillant sur différentes fonctionnalités.
- Cycles de release planifiés : Produits avec des dates de sortie prédéfinies.
- Maintenance de versions multiples : Logiciels nécessitant le support de plusieurs versions en parallèle.
À l'inverse, GitFlow n'est généralement pas recommandé pour :
- Applications web avec déploiement continu
- Petites équipes ou projets simples
- Startups en phase d'itération rapide
Bonnes pratiques avec GitFlow
- Commits atomiques : Chaque commit doit représenter un changement logique unique.
- Messages de commit descriptifs : Utiliser des messages clairs expliquant le pourquoi du changement.
- Revues de code : Mettre en place des pull requests avant les fusions.
- Tests automatisés : Exécuter les tests avant chaque fusion importante.
- Documentation : Maintenir une documentation sur le workflow pour l'équipe.
- Branches de courte durée : Éviter les branches de fonctionnalités trop longues.
Outils pour faciliter l'utilisation de GitFlow
- git-flow-avh : Extension de ligne de commande
- SourceTree : Interface graphique avec support intégré de GitFlow
- GitKraken : Interface graphique avec visualisation du workflow
- VS Code avec GitLens : Extension pour visualiser l'historique et les branches
- IntelliJ/WebStorm : Support intégré de GitFlow
Conclusion
GitFlow est un modèle de gestion de branches structuré et rigoureux qui convient particulièrement aux projets complexes avec des cycles de release planifiés. Sa force réside dans sa capacité à organiser le développement en équipe et à gérer efficacement plusieurs versions d'un logiciel.
Cependant, sa complexité peut être excessive pour certains projets, et des alternatives plus légères comme GitHub Flow ou Trunk-Based Development peuvent être plus appropriées dans certains contextes, notamment pour le développement web avec déploiement continu.
Le choix du modèle de branches doit toujours être adapté aux besoins spécifiques du projet et de l'équipe. L'essentiel est de suivre un processus cohérent qui facilite la collaboration et garantit la qualité du code.
Ressources
- Article original de Vincent Driessen
- Documentation git-flow
- Cheat sheet git-flow
- Atlassian Git Workflow Guide
- Git Branching Strategies vs. Trunk-Based Development
- GitHub Flow
