1. GitFlow

GitFlow est un modèle de branchement populaire défini par Vincent Driessen (2010). Il convient aux projets avec des releases planifiées.

Les 5 types de branches

BrancheRôleDurée de vie
mainCode en production, toujours stablePermanente
developIntégration des features, base pour les releasesPermanente
feature/*Développement d'une nouvelle fonctionnalitéTemporaire
release/*Préparation d'une release (bug fixes mineurs)Temporaire
hotfix/*Correction urgente d'un bug en productionTemporaire

Workflow GitFlow typique

git checkout develop
git checkout -b feature/login
# ... développement ...
git commit -m "feat(auth): add login form"
git checkout develop
git merge --no-ff feature/login   # Toujours --no-ff
git branch -d feature/login

# Release :
git checkout -b release/1.2.0 develop
# ... tests, bump version ...
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

Avantages et limites

  • Avantages : Isolation des features, releases stables, hotfix propres
  • Limites : Beaucoup de branches, merges fréquents, overhead pour les petites équipes
  • Quand l'utiliser : Logiciel packagé, versions multiples en production simultanément

2. GitHub Flow

GitHub Flow est un workflow simplifié : une seule branche principale (main) + des feature branches courtes. Tout passe par des Pull Requests.

Les 6 étapes de GitHub Flow

#ÉtapeCommande / Action
1Créer une branche depuis maingit checkout -b feature/ma-feature main
2Commits sur la branchegit commit -m "feat: ..."
3Ouvrir une Pull RequestGitHub UI ou gh pr create
4Discussion & Code ReviewCommentaires, suggestions, CI vert
5Merger la PRSquash merge recommandé
6Déploiement automatiqueCI/CD déclenché sur main
git checkout -b feature/user-profile main
# ... code, commits ...
git push -u origin feature/user-profile
# Ouvrir PR sur GitHub → review → merge
# CI s'exécute → déploiement automatique
GitHub Flow recommandé pour : applications web avec déploiement continu, équipes qui déploient plusieurs fois par jour, open-source sur GitHub.

3. Trunk-Based Development

Trunk-Based Development (TBD) pousse encore plus loin : les branches vivent moins d'un jour avant d'être mergées dans main. Les features incomplètes sont cachées avec des feature flags.

Principe

# Branche très courte (quelques heures max)
git checkout -b fix/typo-header
git commit -m "fix: correct header typo"
git push origin fix/typo-header
# Merge le même jour !

Comparaison GitFlow vs GitHub Flow vs TBD

CritèreGitFlowGitHub FlowTrunk-Based
Branches activesBeaucoup (5 types)Feature + mainQuasi aucune
Durée des branchesSemaines/moisJours/semainesHeures
Fréquence déploiementReleases planifiéesContinu (PR merge)Plusieurs fois/jour
Feature flagsNon requisOptionnelObligatoire
Taille équipe idéaleToutesPetite/moyenneExpérimentée
Google, Facebook et Netflix utilisent TBD à grande échelle. Cela requiert une suite de tests solide et une culture CI forte.

4. Conventional Commits

Conventional Commits est une convention de messages de commit qui permet de générer automatiquement le CHANGELOG et de déterminer la prochaine version SemVer.

Format

type(scope): description

# Corps optionnel (après une ligne vide)
# Explique le POURQUOI, pas le QUOI

# Pied de page optionnel
BREAKING CHANGE: description de la rupture

Types de commits

TypeSignificationImpact SemVer
featNouvelle fonctionnalitéMINOR (1.1.0)
fixCorrection de bugPATCH (1.0.1)
BREAKING CHANGERupture d'APIMAJOR (2.0.0)
docsDocumentation uniquementAucun
styleFormatage, virgules…Aucun
refactorRestructuration sans bug fix/featureAucun
testAjout/modification de testsAucun
choreBuild, dépendances, CI…Aucun
perfAmélioration des performancesPATCH
ciFichiers CI/CDAucun

Exemples concrets

git commit -m "feat(auth): add OAuth2 Google login"
git commit -m "fix(api): handle null response from /users endpoint"
git commit -m "chore: update dependencies to latest versions"
git commit -m "docs(readme): add installation instructions"
git commit -m "refactor: extract authentication logic to AuthService"

# Breaking change :
git commit -m "feat!: change API response format to JSON:API spec

BREAKING CHANGE: API responses now follow JSON:API format.
All clients must be updated to handle the new structure."
Outils utiles : commitlint + husky pour valider automatiquement les commits. conventional-changelog ou release-please pour générer le CHANGELOG.

5. Semantic Versioning

SemVer (semver.org) définit un format de version : MAJOR.MINOR.PATCH.

Règles d'incrémentation

VersionQuand l'incrémenterExemple
MAJORChangement incompatible (breaking change)1.5.2 → 2.0.0
MINORNouvelle fonctionnalité rétro-compatible1.5.2 → 1.6.0
PATCHCorrection de bug rétro-compatible1.5.2 → 1.5.3

Tags Git et versions

# Créer un tag annoté
git tag -a v1.2.0 -m "Release 1.2.0 — ajout OAuth2"

# Pousser les tags sur le remote
git push origin --tags

# Lister les tags
git tag -l
git tag -l "v1.*"     # Filtrer par pattern

# Voir les détails d'un tag
git show v1.2.0

# Supprimer un tag local et remote
git tag -d v1.2.0-beta
git push origin :refs/tags/v1.2.0-beta
Versions pré-release : 1.0.0-alpha.1, 1.0.0-beta.2, 1.0.0-rc.1. En npm, une version MINOR ou PATCH sans BREAKING CHANGE garantit la compatibilité ascendante.

6. Git Hooks

Les Git Hooks sont des scripts qui s'exécutent automatiquement lors d'événements Git (commit, push…). Ils vivent dans .git/hooks/.

Hooks côté client (les plus utilisés)

HookDéclenchéUsage typique
pre-commitAvant la création du commitLancer lint, formatter le code
commit-msgAprès la saisie du messageValider le format Conventional Commits
pre-pushAvant le push vers le remoteLancer les tests
post-commitAprès la création du commitNotifications, logs

Hook pre-commit manuel

#!/bin/bash
# .git/hooks/pre-commit
echo "🔍 Running lint before commit..."
npm run lint
if [ $? -ne 0 ]; then
  echo "❌ Lint failed. Commit aborted."
  exit 1
fi
echo "✅ Lint passed!"
# Rendre le hook exécutable
chmod +x .git/hooks/pre-commit

Husky + lint-staged (recommandé pour Node.js)

# Installation
npm install --save-dev husky lint-staged
npx husky init

# package.json
{
  "lint-staged": {
    "*.{js,ts}": ["eslint --fix", "prettier --write"],
    "*.{css,md}": ["prettier --write"]
  }
}

# .husky/pre-commit
npx lint-staged

git bisect — trouver le commit qui a introduit un bug

git bisect start
git bisect bad                    # HEAD contient le bug
git bisect good v1.0.0           # Cette version était bonne
# Git checkout automatiquement le commit médian
# Tester → indiquer si bon ou mauvais
git bisect good                   # ou git bisect bad
# Répéter jusqu'à trouver le coupable
git bisect reset                  # Revenir à HEAD
→ Passer aux exercices O08