Gitflow
Gitflow est un modèle de branching Git défini par Vincent Driessen. Il organise le développement autour de branches à rôles fixes, adapté aux projets avec des cycles de release planifiés.
Vue d'ensemble
main ──●────────────────────────────●──────────────●──→
│ tag v1.0 │ tag v1.1 │ tag v1.1.1
│ │ │
develop ──●──────●──────●──────●───────●───────●───────●──→
│ │ │ │ │
feature/ ──●─────● │ │ │
login │ │ │
feature/ ───────● │ │
paiement │ │
release/ ──────● │
1.1 │
hotfix/ ───────●
1.1.1
Rôle de chaque branche
| Branche | Durée | Rôle |
|---|---|---|
main |
Permanente | Code en production — chaque commit est une version livrée, taguée |
develop |
Permanente | Intégration continue — base de toutes les features |
feature/* |
Temporaire | Développement d'une fonctionnalité isolée |
release/* |
Temporaire | Stabilisation avant livraison (bugfixes, version bump) |
hotfix/* |
Temporaire | Correction urgente en production |
Règles fondamentales
✅ On ne commite jamais directement sur main
✅ On ne commite jamais directement sur develop (sauf petits projets solo)
✅ Les features partent toujours de develop
✅ Les releases et hotfixes mergent dans main ET develop
✅ Chaque merge dans main reçoit un tag de version
Initialisation
# Initialiser gitflow dans un dépôt existant
git flow init
# → Questions interactives (appuyer sur Entrée pour les valeurs par défaut)
# Branch name for production releases: [main]
# Branch name for "next release" development: [develop]
# Feature branch prefix: [feature/]
# Release branch prefix: [release/]
# Hotfix branch prefix: [hotfix/]
# Version tag prefix: [v]
# Sans git flow CLI — initialisation manuelle
git checkout -b develop main
git push -u origin develop
Convention de nommage
feature/nom-de-la-feature feature/authentification-oauth
release/version release/2.3.0
hotfix/description-du-bug hotfix/correction-login-csrf
Feature
Une feature est une fonctionnalité développée en isolation depuis develop.
develop ──●──────────────────●──→
│ │
feature/ ●──●──●──●─────────●
auth
Avec git flow CLI
# Créer une feature
git flow feature start authentification-oauth
# → crée feature/authentification-oauth depuis develop
# Travailler normalement
git add .
git commit -m "feat(auth): ajouter le flow OAuth2 Google"
# Terminer la feature (merge dans develop, supprime la branche)
git flow feature finish authentification-oauth
# → merge dans develop + supprime feature/authentification-oauth
# Partager la feature (travail en équipe)
git flow feature publish authentification-oauth
git flow feature pull origin authentification-oauth
Équivalent git vanilla
# Créer
git checkout develop
git checkout -b feature/authentification-oauth
# Merger
git checkout develop
git merge --no-ff feature/authentification-oauth # --no-ff : préserve l'historique
git branch -d feature/authentification-oauth
git push origin develop
--no-ff(no fast-forward) crée toujours un commit de merge, ce qui préserve le contexte de la feature dans l'historique.
Release
La branche release sert à stabiliser le code avant livraison : correction de bugs mineurs, mise à jour du numéro de version, documentation. Aucune nouvelle fonctionnalité.
develop ──●──────────────────────────●──→
│ │
release/ ●──●(bugfix)──●(version)───●
2.3.0 │
main ────────────────────────────●──→
tag v2.3.0
Avec git flow CLI
# Créer la release
git flow release start 2.3.0
# → crée release/2.3.0 depuis develop
# Corrections de dernière minute, version bump
git commit -m "chore(release): bump version 2.3.0"
git commit -m "fix(api): corriger la pagination des résultats"
# Terminer la release
git flow release finish 2.3.0
# → merge dans main (avec tag v2.3.0) ET dans develop
# → supprime release/2.3.0
# Pousser tout
git push origin main develop --tags
Équivalent git vanilla
# Créer
git checkout develop
git checkout -b release/2.3.0
# Finaliser
git checkout main
git merge --no-ff release/2.3.0
git tag -a v2.3.0 -m "Version 2.3.0"
git checkout develop
git merge --no-ff release/2.3.0
git branch -d release/2.3.0
git push origin main develop --tags
Hotfix
Un hotfix corrige un bug critique directement en production. Il part de main et doit être répercuté dans develop.
main ──●─────────────────────────●──→
│ tag v2.3.0 │ tag v2.3.1
│ │
hotfix/ ●──●(fix)─────────────●──●
2.3.1 │
develop ──────────────────────────●──→
Avec git flow CLI
# Créer le hotfix depuis main
git flow hotfix start 2.3.1
# → crée hotfix/2.3.1 depuis main
# Corriger le bug
git commit -m "fix(auth): corriger la faille CSRF sur le formulaire de login"
# Terminer le hotfix
git flow hotfix finish 2.3.1
# → merge dans main (avec tag v2.3.1) ET dans develop
# → supprime hotfix/2.3.1
git push origin main develop --tags
Équivalent git vanilla
# Créer
git checkout main
git checkout -b hotfix/2.3.1
# Corriger
git commit -m "fix(auth): corriger la faille CSRF sur le formulaire de login"
# Merger dans main
git checkout main
git merge --no-ff hotfix/2.3.1
git tag -a v2.3.1 -m "Hotfix 2.3.1"
# Répercuter dans develop
git checkout develop
git merge --no-ff hotfix/2.3.1
git branch -d hotfix/2.3.1
git push origin main develop --tags
Conventional Commits
Les Conventional Commits standardisent les messages de commit pour rendre l'historique lisible et automatiser le versioning.
Format
type(scope): description courte
[corps optionnel — explication détaillée]
[footer optionnel — références issues, breaking changes]
feat(auth): ajouter la connexion via Google OAuth
^ ^ ^
│ │ └─ description en minuscules, impératif, sans point final
│ └────────── scope : module ou composant concerné (optionnel)
└─────────────── type : nature du changement
Types
| Type | Usage | Impact version |
|---|---|---|
feat |
Nouvelle fonctionnalité | MINOR (1.x.0) |
fix |
Correction de bug | PATCH (1.0.x) |
docs |
Documentation uniquement | — |
style |
Formatage, espaces (sans changement logique) | — |
refactor |
Refactoring sans nouvelle feature ni bug fix | — |
test |
Ajout ou correction de tests | — |
chore |
Tâches de maintenance (dépendances, config, CI) | — |
perf |
Amélioration de performance | PATCH |
build |
Système de build, scripts | — |
ci |
Configuration CI/CD | — |
Exemples concrets
# Feature
git commit -m "feat(panier): ajouter le calcul automatique des frais de port"
# Bug fix
git commit -m "fix(auth): corriger l'expiration du token après déconnexion"
# Avec scope et corps
git commit -m "refactor(api): extraire la logique de pagination dans un helper
Déplacé depuis UserController et ProductController vers utils/pagination.js
pour éviter la duplication."
# Chore
git commit -m "chore(deps): mettre à jour express 4.18 → 4.19"
# CI/CD
git commit -m "ci(github-actions): ajouter le job de tests e2e Playwright"
# Documentation
git commit -m "docs(readme): ajouter les instructions d'installation Docker"
Intégration avec Gitflow
# Sur une branche feature — commits granulaires
git commit -m "feat(facturation): ajouter le formulaire de saisie IBAN"
git commit -m "feat(facturation): intégrer la validation IBAN côté serveur"
git commit -m "test(facturation): ajouter les tests du validateur IBAN"
# Sur une branche release — uniquement fix et chore
git commit -m "fix(facturation): corriger l'affichage du symbole € sur Safari"
git commit -m "chore(release): bump version 2.4.0"
# Sur une branche hotfix — toujours fix
git commit -m "fix(securite): corriger l'injection SQL dans la recherche produits"
Récapitulatif des commandes
| Action | git flow | git vanilla |
|---|---|---|
| Initialiser | git flow init |
git checkout -b develop main |
| Créer feature | git flow feature start nom |
git checkout -b feature/nom develop |
| Terminer feature | git flow feature finish nom |
merge --no-ff dans develop |
| Créer release | git flow release start x.x.x |
git checkout -b release/x.x.x develop |
| Terminer release | git flow release finish x.x.x |
merge --no-ff dans main + develop + tag |
| Créer hotfix | git flow hotfix start x.x.x |
git checkout -b hotfix/x.x.x main |
| Terminer hotfix | git flow hotfix finish x.x.x |
merge --no-ff dans main + develop + tag |