Par Ahmed Karim BETKOM•9 min de lecture

Le chaos d'avant : quand tout le monde pousse sur master
Vous connaissez ce scénario ? Vous êtes en train de développer une grosse feature. Vous committez sur master. Votre collègue aussi. Un autre pousse un fix urgent. Résultat : master est cassé, personne ne sait quelle version est déployable, et le client hurle parce que la prod est down.
Le problème du "tout sur master" :
- Code instable en permanence : Master mélange du code testé, du code en cours, et du code qui compile pas
- Impossible de revenir en arrière proprement : Quel commit déployer en prod ? Celui d'il y a 3h ? Celui de ce matin ?
- Conflits Git cauchemar : 3 devs modifient le même fichier, personne ne sait qui a raison
- Hotfixes qui cassent tout : Vous fixez un bug en urgence, mais vous écrasez la feature de votre collègue
- Zéro traçabilité : Qui a poussé ce code ? Pourquoi ? C'était validé par qui ?
Temps perdu par semaine : 5-8h en conflits Git, debugging "qui a cassé master", et discussions Slack "attends je push pas, laisse-moi finir d'abord".
Git Flow : le workflow qui structure tout
Git Flow, c'est une méthodologie de branches standardisée. Inventée par Vincent Driessen en 2010, elle définit exactement quelle branche utiliser pour quoi, comment merger, et comment gérer releases et hotfixes.
Le principe en une phrase : chaque type de travail a sa propre branche, et on ne merge jamais n'importe comment.
Les 5 types de branches Git Flow
main (ou master)
→ Code en production, toujours stable
→ Seules les releases et hotfixes peuvent merger ici
→ Tag pour chaque version (v1.0.0, v1.1.0, etc.)
develop
→ Code de développement en cours
→ Intégration continue de toutes les features
→ Base pour créer les releases
feature/*
→ Une branche par fonctionnalité
→ Créée depuis develop, mergée dans develop
→ Exemples : feature/login, feature/payment
release/*
→ Préparation d'une nouvelle version
→ Créée depuis develop, mergée dans main ET develop
→ Permet de figer les features et corriger les derniers bugs
hotfix/*
→ Fix urgent sur la production
→ Créée depuis main, mergée dans main ET develop
→ Permet de corriger sans attendre la prochaine release
Le workflow complet : de la feature à la production
Voici comment fonctionne Git Flow du début à la fin, étape par étape.
Étape 1 : Développer une nouvelle feature
# Se placer sur develop
git checkout develop
git pull origin develop
# Créer une branche feature
git checkout -b feature/user-authentication
# Développer, committer
git add .
git commit -m "feat: add login form"
git commit -m "feat: add JWT token validation"
git commit -m "feat: add password encryption"
# Pousser la branche
git push origin feature/user-authentication
Résultat : Votre feature est isolée. Vous ne cassez pas le travail des autres, et les autres ne cassent pas le vôtre.
Étape 2 : Créer une Merge Request (MR) sur GitLab
Au lieu de merger directement, vous passez par une Merge Request. C'est la clé de la qualité du code.
- Allez sur GitLab → Merge Requests → New Merge Request
- Source branch :
feature/user-authentication - Target branch :
develop - Assignez des reviewers (vos collègues)
- Décrivez ce que fait la feature
Ce qui se passe automatiquement : GitLab lance le pipeline CI/CD, teste votre code, vérifie la sécurité, et notifie les reviewers.
Étape 3 : Code Review par vos pairs
Vos collègues reviewent votre code directement dans GitLab. Ils peuvent :
- Commenter ligne par ligne : "Ce if pourrait être simplifié"
- Suggérer des modifications : GitLab génère un diff que tu peux accepter en 1 clic
- Approuver ou demander des changements : Pas de merge tant que tout le monde n'a pas approuvé
- Créer des threads de discussion : Conversation contextuelle directement sur le code
Gain : Zéro bug qui passe inaperçu, code de meilleure qualité, équipe qui monte en compétences.
Étape 4 : Merge dans develop
# Une fois la MR approuvée, merger dans develop
# (sur GitLab, bouton "Merge" directement dans l'interface)
# Ou en ligne de commande :
git checkout develop
git pull origin develop
git merge --no-ff feature/user-authentication
git push origin develop
# Supprimer la branche feature (nettoyage)
git branch -d feature/user-authentication
git push origin --delete feature/user-authentication
Option recommandée : Utilisez le bouton "Merge" de GitLab. Il merge, ferme la MR, et supprime la branche automatiquement.
Étape 5 : Préparer une release
Quand vous avez assez de features dans develop, vous préparez une release.
# Créer une branche release
git checkout develop
git pull origin develop
git checkout -b release/1.2.0
# Figer la version dans le code
# Exemple : update version in pom.xml, package.json, etc.
mvn versions:set -DnewVersion=1.2.0
# Corriger les derniers bugs (pas de nouvelles features !)
git commit -m "chore: bump version to 1.2.0"
git commit -m "fix: correct login redirect"
# Pousser la branche
git push origin release/1.2.0
Règle d'or : Sur une branche release, on corrige les bugs, on ne développe pas de nouvelles features.
Étape 6 : Merger la release en production
# Merger dans main (production)
git checkout main
git pull origin main
git merge --no-ff release/1.2.0
git tag -a v1.2.0 -m "Release version 1.2.0"
git push origin main --tags
# Merger aussi dans develop (pour récupérer les derniers fixes)
git checkout develop
git pull origin develop
git merge --no-ff release/1.2.0
git push origin develop
# Supprimer la branche release
git branch -d release/1.2.0
git push origin --delete release/1.2.0
Résultat : Version v1.2.0 déployée en prod, taggée, traçable. En cas de problème, vous savez exactement quel commit déployer.
Les hotfixes : corriger la prod sans casser develop
Un bug critique en production ? Pas le temps d'attendre la prochaine release. Les hotfixes sont là pour ça.
Workflow hotfix complet
# 1. Créer une branche hotfix depuis main
git checkout main
git pull origin main
git checkout -b hotfix/fix-payment-bug
# 2. Corriger le bug
git commit -m "fix: resolve payment gateway timeout"
# 3. Bump la version (patch)
# v1.2.0 → v1.2.1
mvn versions:set -DnewVersion=1.2.1
git commit -m "chore: bump version to 1.2.1"
# 4. Merger dans main (production)
git checkout main
git merge --no-ff hotfix/fix-payment-bug
git tag -a v1.2.1 -m "Hotfix: payment gateway timeout"
git push origin main --tags
# 5. Merger aussi dans develop (important !)
git checkout develop
git merge --no-ff hotfix/fix-payment-bug
git push origin develop
# 6. Supprimer la branche hotfix
git branch -d hotfix/fix-payment-bug
git push origin --delete hotfix/fix-payment-bug
Pourquoi merger dans develop aussi ? Sinon, le bug réapparaît dans la prochaine release. Vous corrigez en prod, mais la correction n'est pas dans develop.
GitLab : les fonctionnalités qui rendent Git Flow efficace
1. Protected Branches : empêcher les pushs directs
Dans GitLab, allez dans Settings → Repository → Protected Branches.
- Protégez
main: Personne ne peut pusher directement - Protégez
develop: Seuls les Maintainers peuvent merger - Activez "Require approval from code owners" : 2 approbations minimum avant merge
Résultat : Impossible de casser main par accident. Tout passe par une Merge Request reviewée.
2. Merge Request Templates : standardiser les MR
Créez un fichier .gitlab/merge_request_templates / Default.md :
## Description
## Type de changement
- [ ] Feature (nouvelle fonctionnalité)
- [ ] Fix (correction de bug)
- [ ] Refactoring (amélioration du code sans changer le comportement)
- [ ] Documentation
## Tests
- [ ] Tests unitaires ajoutés
- [ ] Tests d'intégration ajoutés
- [ ] Testé manuellement
## Checklist
- [ ] Le code suit les conventions du projet
- [ ] Les tests passent en local
- [ ] La documentation est à jour
- [ ] Pas de secrets hardcodés
- [ ] Le pipeline CI/CD passe
## Screenshots (si applicable)
## Issues liées
Closes #123
Résultat : Toutes les MR sont complètes, documentées, et les reviewers savent exactement ce qu'ils doivent vérifier.
3. Approval Rules : forcer la review
Dans Settings → Merge Requests → Approval Rules :
- Nombre d'approbations minimum : 2
- Code owners requis : Oui (pour les fichiers critiques)
- L'auteur de la MR ne peut pas s'approuver lui-même
- Bloquer le merge si le pipeline échoue
Résultat : Impossible de merger du code non testé ou non reviewé. La qualité est garantie.
4. Squash Commits : garder un historique propre
Activez "Squash commits when merging" dans les settings de la MR.
Avant squash (historique pollué) :
* fix typo
* fix typo again
* add login form
* fix login form
* update login form
* final fix I promise
Après squash (historique propre) :
* feat: add user authentication with JWT
Résultat : L'historique de main est lisible. Chaque commit = une feature ou un fix complet.
5. Branch Auto-Delete : nettoyage automatique
Dans Settings → Merge Requests, activez "Enable 'Delete source branch' option by default".
Résultat : Les branches feature/release/hotfix sont supprimées automatiquement après merge. Votre repo reste propre.
Conventions de nommage : tout le monde parle le même langage
Sans convention : Vous avez des branches qui s'appellent fix, my-feature, test, ahmed-dev. Impossible de savoir ce qu'elles font.
Avec convention : Tout le monde suit la même nomenclature.
Convention de nommage des branches
feature/NOM-COURT-DE-LA-FEATURE
Exemples :
- feature/user-login
- feature/payment-integration
- feature/email-notifications
fix/NOM-DU-BUG
Exemples :
- fix/login-redirect-error
- fix/payment-timeout
- fix/email-encoding
hotfix/NOM-DU-HOTFIX
Exemples :
- hotfix/critical-security-patch
- hotfix/payment-gateway-down
release/VERSION
Exemples :
- release/1.2.0
- release/2.0.0
Convention de nommage des commits (Conventional Commits)
feat: nouvelle fonctionnalité
Exemples :
- feat: add user authentication
- feat: implement payment gateway
fix: correction de bug
Exemples :
- fix: resolve login timeout issue
- fix: correct email validation regex
chore: tâches de maintenance
Exemples :
- chore: update dependencies
- chore: bump version to 1.2.0
docs: documentation
Exemples :
- docs: add API documentation
- docs: update README
refactor: amélioration du code
Exemples :
- refactor: simplify authentication logic
- refactor: extract payment service
test: ajout/modification de tests
Exemples :
- test: add unit tests for login
- test: improve integration test coverage
style: formatage du code
Exemples :
- style: format code with prettier
- style: fix indentation
Résultat : En regardant l'historique Git, vous savez exactement ce qui a été fait, par qui, et pourquoi.
Les pièges à éviter (on les a tous faits)
Piège #1 : Feature branch qui vit trop longtemps
Une branche feature qui reste ouverte 3 semaines accumule des conflits énormes avec develop. Règle d'or : une feature = 2-5 jours max. Si c'est plus long, découpez en sous-features.
Piège #2 : Oublier de merger le hotfix dans develop
Vous corrigez un bug critique en prod (hotfix dans main), mais vous oubliez de merger dans develop. Résultat : le bug réapparaît dans la prochaine release. Toujours merger hotfix dans main ET develop.
Piège #3 : Développer sur develop directement
Develop doit rester stable. Ne développez JAMAIS directement dessus. Toujours créer une branche feature, même pour un "petit fix de 2 lignes".
Piège #4 : Force push sur une branche partagée
git push --force écrase l'historique. Si quelqu'un d'autre travaille sur la même branche, vous détruisez son travail. Utilisez --force-with-lease si vraiment nécessaire, mais évitez au maximum.
Piège #5 : Commits trop gros ou trop vagues
Un commit "fix stuff" qui change 50 fichiers, c'est impossible à reviewer. Règle : 1 commit = 1 changement logique. Si vous avez corrigé 3 bugs, faites 3 commits séparés.
Alternatives à Git Flow : GitHub Flow et GitLab Flow
Git Flow n'est pas le seul workflow. Selon votre contexte, d'autres peuvent être plus adaptés.
GitHub Flow : plus simple, pour du déploiement continu
Principe : Une seule branche principale (main), des branches feature, merge direct en prod.
main (toujours déployable)
↓
feature/ma-feature
↓
Merge Request → Review → Merge dans main
↓
Déploiement automatique en production
Quand l'utiliser : Applications web avec déploiement continu, pas de releases fixes, équipes qui déploient 10+ fois par jour.
GitLab Flow : le meilleur des deux mondes
Principe : Branches d'environnement (production, staging, development).
main (développement)
↓
feature/ma-feature → Merge dans main
↓
staging (environnement de test)
↓
production (prod finale)
Quand l'utiliser : Applications avec plusieurs environnements, déploiements progressifs (staging → prod).
Comparaison rapide
| Workflow | Complexité | Cas d'usage |
|---|---|---|
| Git Flow | Élevée | Releases planifiées, versions fixes |
| GitHub Flow | Faible | Déploiement continu, web apps |
| GitLab Flow | Moyenne | Environnements multiples, staging |
Automatiser Git Flow avec des scripts
Taper manuellement toutes les commandes Git Flow, c'est lourd. Automatisez avec git-flow CLI ou des scripts custom.
Installer git-flow CLI
# macOS
brew install git-flow
# Ubuntu/Debian
sudo apt-get install git-flow
# Windows
choco install gitflow-avh
Initialiser Git Flow
git flow init
# Accepter les valeurs par défaut :
# - Branche de production : main
# - Branche de développement : develop
# - Préfixe feature : feature/
# - Préfixe release : release/
# - Préfixe hotfix : hotfix/
Commandes simplifiées avec git-flow
# Créer une feature
git flow feature start user-login
# = git checkout -b feature/user-login develop
# Finir une feature (merge dans develop)
git flow feature finish user-login
# = git checkout develop
# git merge --no-ff feature/user-login
# git branch -d feature/user-login
# Créer une release
git flow release start 1.2.0
# Finir une release (merge dans main ET develop)
git flow release finish 1.2.0
# = git checkout main
# git merge --no-ff release/1.2.0
# git tag -a v1.2.0
# git checkout develop
# git merge --no-ff release/1.2.0
# Créer un hotfix
git flow hotfix start fix-payment-bug
# Finir un hotfix (merge dans main ET develop)
git flow hotfix finish fix-payment-bug
Résultat : Git Flow en 1 commande au lieu de 5-10. Gain de temps énorme, zéro erreur.
Les gains concrets (chiffrés)
Avant Git Flow : 8-12h/semaine perdues
- 3-4h en résolution de conflits Git chaotiques
- 2-3h en debugging "qui a cassé master"
- 2h en coordination manuelle "attends je finis de pusher"
- 1-2h en rollback parce qu'on a déployé du code pas testé
Après Git Flow : ~1h/semaine
- 30min de code review (mais c'est du temps bien investi)
- 20min de gestion des branches (création, merge)
- 10min de résolution de conflits mineurs
Gain net : 7-11h/semaine par développeur. Sur une équipe de 5, c'est 35-55h récupérées. Par semaine.
Bonus mesurables :
- Conflits Git : -90% (branches isolées + merges fréquents)
- Bugs en production : -70% (code review + tests automatiques)
- Temps de résolution de bug : -60% (historique propre = debug facile)
- Onboarding des nouveaux : -80% de temps (workflow clair et documenté)
- Rollback en cas de problème : de 2h à 5min (tags Git + déploiement automatique)
Checklist pour démarrer en 30 minutes
Vous voulez mettre en place Git Flow cet après-midi ? Voici les étapes dans l'ordre :
-
1. Installez git-flow CLI :
brew install git-flow(5 minutes) -
2. Initialisez Git Flow sur votre repo :
git flow init(2 minutes) - 3. Protégez main et develop dans GitLab : Settings → Repository → Protected Branches (5 minutes)
- 4. Configurez les Approval Rules : Minimum 2 approbations pour merger (3 minutes)
- 5. Créez un template de Merge Request : .gitlab/merge_request_templates/Default.md (5 minutes)
- 6. Documentez le workflow pour l'équipe : README avec les conventions (10 minutes)
-
7. Créez votre première feature :
git flow feature start testet testez le cycle complet (5 minutes)
Temps total : 30-35 minutes. ROI : 7-11h/semaine économisées. Dès la première semaine.
Template de documentation pour votre équipe
README.md à copier-coller
# Workflow Git Flow
## Branches principales
- main : Code en production, toujours stable
- develop : Code de développement, intégration continue
## Types de branches
### Feature (nouvelle fonctionnalité)
```bash
git flow feature start nom-feature
# Développer...
git flow feature finish nom-feature
```
### Release (nouvelle version)
```bash
git flow release start 1.2.0
# Figer la version, corriger les bugs...
git flow release finish 1.2.0
```
### Hotfix (correction urgente en prod)
```bash
git flow hotfix start nom-hotfix
# Corriger le bug...
git flow hotfix finish nom-hotfix
```
## Convention de nommage
### Branches
- feature/nom-court
- release/x.y.z
- hotfix/nom-court
### Commits (Conventional Commits)
- feat: nouvelle fonctionnalité
- fix: correction de bug
- chore: maintenance
- docs: documentation
- refactor: amélioration du code
- test: ajout de tests
## Merge Request
1. Créer une MR de votre feature vers develop
2. Assigner 2 reviewers minimum
3. Attendre l'approbation + pipeline vert
4. Merger avec squash (historique propre)
## Règles d'or
- ❌ Jamais de push direct sur main ou develop
- ✅ Toujours créer une branche feature, même pour un petit fix
- ✅ Garder les features courtes (2-5 jours max)
- ✅ Merger les hotfixes dans main ET develop
- ✅ Code review obligatoire avant merge
Conclusion : Git Flow n'est plus optionnel en 2026
En 2026, travailler sans workflow Git structuré, c'est comme coder sans tests. Ça peut fonctionner sur un projet solo, mais c'est un suicide en équipe.
Git Flow (ou GitHub Flow, ou GitLab Flow), ce n'est pas juste de l'organisation. C'est :
- La sérénité : Vous savez que main est toujours déployable
- La traçabilité : Vous savez qui a fait quoi, quand, et pourquoi
- La qualité : Code review systématique = zéro bug qui passe inaperçu
- La vitesse : Moins de conflits = moins de temps perdu
- La scalabilité : Le même workflow pour 2 ou 50 devs
Le setup initial prend 30 minutes. Le gain est immédiat : dès la première semaine, vous récupérez 7-11h de travail chaotique. Sur un an, c'est 350-550h économisées par développeur. Sur une équipe de 5, ça fait 1750-2750h. L'équivalent de 1 ETP complet.
Le vrai ROI (au-delà du temps gagné)
- Culture de la qualité : Code review devient la norme, pas l'exception
- Montée en compétences : Les juniors apprennent en reviewant le code des seniors
- Documentation vivante : L'historique Git raconte l'histoire du projet
- Moins de turnover : Les devs préfèrent travailler dans un environnement organisé
- Audit et compliance : Tout est tracé, approuvé, documenté
En résumé : pourquoi Git Flow change tout
- ✅ Temps gagné : 7-11h/semaine par développeur
- ✅ Conflits Git : -90% de conflits chaotiques
- ✅ Bugs en prod : -70% grâce au code review
- ✅ Historique propre : Chaque commit raconte une histoire
- ✅ Rollback rapide : De 2h à 5min en cas de problème
- ✅ Traçabilité totale : Qui a fait quoi, quand, pourquoi
- ✅ Setup rapide : 30 minutes, gains immédiats

