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