Module 2 : Branches & Pull Requests
Objectif du Module
Maîtriser le travail collaboratif avec Git : créer des branches, gérer les Pull Requests, résoudre les conflits, et comprendre les stratégies de branching (Git Flow, GitHub Flow).
Durée : 1 heure
Concept : Pourquoi les Branches ?
Le Problème du Développement Linéaire
Imaginez une équipe de 5 développeurs travaillant sur la même branche main :
- ❌ Développeur A pousse du code cassé → Tout le monde est bloqué
- ❌ Développeur B et C modifient le même fichier → Conflits constants
- ❌ Impossible de tester une feature isolée sans merger du code non fini
Solution : Les Branches Git
Les branches permettent de créer des lignes de développement parallèles :
- ✅ Chaque feature/bug se développe dans sa propre branche
- ✅ La branche
mainreste stable (production-ready) - ✅ Les features sont testées avant d'être mergées
- ✅ Plusieurs développeurs travaillent sans se bloquer
Les 3 Zones + Branches
flowchart TD
subgraph "Repository Local"
A[main branch<br/>Code stable]
B[feature/login<br/>Nouvelle feature]
C[hotfix/security<br/>Correctif urgent]
end
subgraph "Remote Repository"
D[origin/main]
E[origin/feature/login]
end
A -->|git push| D
B -->|git push| E
B -.->|Pull Request| A
C -.->|Merge rapide| A
style A fill:#4CAF50,stroke:#0b5a0d,color:#fff
style B fill:#2196F3,stroke:#005a9e,color:#fff
style C fill:#f44336,stroke:#b00016,color:#fff
style D fill:#9C27B0,stroke:#3d1e5f,color:#fff
Explication :
- main : Branche principale (code de production)
- feature/login : Branche de développement pour une nouvelle fonctionnalité
- hotfix/security : Branche pour un correctif urgent
- Pull Request : Demande de fusion après review
Pratique : Commandes de Branches
Créer et Naviguer entre Branches
# Lister les branches locales
git branch
# * main
# Créer une nouvelle branche
git branch feature/user-auth
# Lister à nouveau
git branch
# feature/user-auth
# * main
# (L'étoile * indique la branche active)
# Basculer vers la nouvelle branche (ancienne méthode)
git checkout feature/user-auth
# Switched to branch 'feature/user-auth'
# Ou avec la commande moderne (Git 2.23+)
git switch feature/user-auth
# Créer ET basculer en une seule commande
git checkout -b feature/password-reset
# Ou
git switch -c feature/password-reset
# Vérifier la branche active
git branch
# feature/user-auth
# * feature/password-reset
# main
Workflow Complet : Feature Branch
# 1. Partir de main à jour
git switch main
git pull origin main
# 2. Créer une branche feature
git switch -c feature/dark-mode
# 3. Travailler sur la feature
echo "body { background: #1e1e1e; }" > style.css
git add style.css
git commit -m "feat: Ajout du mode sombre"
# 4. Pousser la branche vers le remote
git push -u origin feature/dark-mode
# -u (ou --set-upstream) lie la branche locale à la remote
# 5. Créer une Pull Request sur GitHub/GitLab (via l'interface web)
# 6. Après validation, merger dans main (via l'interface ou CLI)
git switch main
git pull origin main
git merge feature/dark-mode
# Updating abc123..def456
# Fast-forward
# 7. Supprimer la branche locale (optionnel)
git branch -d feature/dark-mode
# Deleted branch feature/dark-mode (was def456)
# 8. Supprimer la branche remote (optionnel)
git push origin --delete feature/dark-mode
Résoudre un Conflit de Merge
Scénario : Deux développeurs modifient le même fichier README.md.
# Développeur A (sur main)
echo "Version 1.0" >> README.md
git add README.md
git commit -m "docs: Version 1.0"
git push origin main
# Développeur B (sur feature/update-readme, créée AVANT le commit de A)
git switch -c feature/update-readme
echo "Version 2.0 Beta" >> README.md
git add README.md
git commit -m "docs: Version 2.0 Beta"
# Développeur B essaie de merger main dans sa branche
git switch feature/update-readme
git merge main
# CONFLICT (content): Merge conflict in README.md
# Automatic merge failed; fix conflicts and then commit the result.
# Ouvrir README.md (le fichier contient maintenant)
cat README.md
# <<<<<<< HEAD
# Version 2.0 Beta
# =======
# Version 1.0
# >>>>>>> main
# Résoudre manuellement (choisir l'une des versions ou combiner)
echo "Version 2.0" > README.md # Décision : garder 2.0
# Ajouter le fichier résolu
git add README.md
git commit -m "merge: Résolution conflit version"
# Maintenant le merge est clean
git log --oneline --graph
# * abc123 (HEAD -> feature/update-readme) merge: Résolution conflit version
# |\
# | * def456 (main) docs: Version 1.0
# * | ghi789 docs: Version 2.0 Beta
Concept : Stratégies de Branching
Git Flow (Classique)
Utilisé pour : Projets avec releases planifiées (logiciels desktop, mobile apps).
gitGraph
commit id: "Initial"
branch develop
checkout develop
commit id: "Dev work"
branch feature/login
checkout feature/login
commit id: "Add login"
commit id: "Add tests"
checkout develop
merge feature/login
branch release/1.0
checkout release/1.0
commit id: "Fix bugs"
checkout main
merge release/1.0 tag: "v1.0"
checkout develop
merge release/1.0
branch hotfix/security
checkout hotfix/security
commit id: "Security patch"
checkout main
merge hotfix/security tag: "v1.0.1"
checkout develop
merge hotfix/security
Branches :
- main : Code en production (tags de version)
- develop : Branche d'intégration (pre-production)
- feature/* : Nouvelles fonctionnalités (partent de develop)
- release/* : Préparation d'une release (partent de develop)
- hotfix/* : Correctifs urgents (partent de main)
Avantages : - ✅ Contrôle total sur les releases - ✅ Historique clair (features, releases, hotfixes distincts)
Inconvénients : - ❌ Complexe (5 types de branches) - ❌ Lent (merges multiples)
GitHub Flow (Simplifié)
Utilisé pour : SaaS, applications web en déploiement continu.
gitGraph
commit id: "Stable"
branch feature/api
checkout feature/api
commit id: "Add API"
commit id: "Tests"
checkout main
merge feature/api tag: "deploy"
branch feature/ui
checkout feature/ui
commit id: "New UI"
checkout main
merge feature/ui tag: "deploy"
commit id: "Production"
Branches :
- main : Toujours déployable (= production)
- feature/* : Branches éphémères pour chaque feature/bug
Workflow :
- Créer une branche depuis
main - Commit + Push
- Ouvrir une Pull Request
- Code Review
- Merger dans
main→ Déploiement automatique (CI/CD) - Supprimer la branche
Avantages : - ✅ Simple (2 types de branches) - ✅ Rapide (déploiement continu)
Inconvénients : - ❌ Pas de releases planifiées - ❌ Nécessite une CI/CD robuste
Comparaison
| Critère | Git Flow | GitHub Flow |
|---|---|---|
| Complexité | ⚠️ Élevée (5 branches) | ✅ Faible (2 branches) |
| Releases | ✅ Planifiées (v1.0, v2.0) | ❌ Continues |
| Hotfixes | ✅ Branches dédiées | ⚠️ Comme des features |
| Déploiement | Manuel (tags) | Automatique (merge = deploy) |
| Cas d'usage | Logiciels packagés | SaaS, Web apps |
Exercice : Workflow Feature Branch
À Vous de Jouer
Contexte : Vous travaillez sur un projet de documentation technique. Votre équipe utilise GitHub Flow.
Tâche :
- Cloner le repo (ou utiliser un repo existant)
- Créer une branche
feature/ajout-section-docker - Ajouter un fichier
docker.mdcontenant "# Guide Docker" - Commiter avec le message : "docs: Ajout section Docker"
- Pousser la branche vers le remote
- Simuler une Pull Request en mergeant dans
mainlocalement - Supprimer la branche
feature/ajout-section-docker
Bonus :
- Créer une seconde branche
feature/ajout-section-k8sdepuismain - Modifier
docker.mddans cette branche (ajouter une ligne) - Créer un conflit en modifiant
docker.mdaussi dansmain - Résoudre le conflit lors du merge
Durée estimée : 15 minutes
Critères de réussite :
- ✅ Branche feature créée et poussée
- ✅ Commit respectant Conventional Commits
- ✅ Merge dans main sans erreur
- ✅ Branche feature supprimée après merge
- ✅ (Bonus) Conflit résolu correctement
Solution : Correction de l'Exercice
Solution Détaillée
Étape 1 : Initialiser le Projet
# Créer un repo (ou utiliser un existant)
mkdir projet-docs
cd projet-docs
git init
echo "# Documentation Technique" > README.md
git add README.md
git commit -m "docs: Initialisation"
# Simuler un remote (optionnel pour l'exercice)
# git remote add origin git@github.com:user/projet-docs.git
# git push -u origin main
Étape 2 : Créer la Feature Branch
# Vérifier qu'on est sur main
git branch
# * main
# Créer et basculer vers la branche feature
git switch -c feature/ajout-section-docker
# Vérifier
git branch
# main
# * feature/ajout-section-docker
Étape 3 : Ajouter le Contenu
# Créer le fichier docker.md
echo "# Guide Docker" > docker.md
# Vérifier le statut
git status
# On branch feature/ajout-section-docker
# Untracked files:
# docker.md
# Ajouter et commiter
git add docker.md
git commit -m "docs: Ajout section Docker"
# [feature/ajout-section-docker abc123] docs: Ajout section Docker
# 1 file changed, 1 insertion(+)
Étape 4 : Pousser la Branche
# Pousser vers le remote (si configuré)
git push -u origin feature/ajout-section-docker
# Si pas de remote, cette commande échoue, c'est normal pour l'exercice local
# Pour cet exercice local, on passe directement au merge
Étape 5 : Merger dans Main
# Basculer vers main
git switch main
# Merger la feature branch
git merge feature/ajout-section-docker
# Updating def456..abc123
# Fast-forward
# docker.md | 1 +
# 1 file changed, 1 insertion(+)
# Vérifier l'historique
git log --oneline
# abc123 (HEAD -> main, feature/ajout-section-docker) docs: Ajout section Docker
# def456 docs: Initialisation
Étape 6 : Supprimer la Feature Branch
# Supprimer la branche locale
git branch -d feature/ajout-section-docker
# Deleted branch feature/ajout-section-docker (was abc123)
# Supprimer la branche remote (si elle existe)
# git push origin --delete feature/ajout-section-docker
# Vérifier
git branch
# * main
Bonus : Créer et Résoudre un Conflit
# 1. Modifier docker.md dans main
git switch main
echo "## Installation" >> docker.md
git add docker.md
git commit -m "docs: Ajout section installation"
# 2. Créer une branche depuis un point AVANT ce commit
# (On va simuler un développeur qui part d'une version plus ancienne)
git switch -c feature/ajout-section-k8s HEAD~1
# HEAD~1 = commit parent (avant "Ajout section installation")
# 3. Modifier le même fichier dans la branche
echo "## Configuration" >> docker.md
git add docker.md
git commit -m "docs: Ajout section configuration"
# 4. Essayer de merger main (CONFLIT!)
git merge main
# Auto-merging docker.md
# CONFLICT (content): Merge conflict in docker.md
# 5. Voir le conflit
cat docker.md
# # Guide Docker
# <<<<<<< HEAD
# ## Configuration
# =======
# ## Installation
# >>>>>>> main
# 6. Résoudre (garder les deux sections)
cat > docker.md <<EOF
# Guide Docker
## Installation
## Configuration
EOF
# 7. Finaliser le merge
git add docker.md
git commit -m "merge: Résolution conflit docker.md"
# 8. Merger dans main
git switch main
git merge feature/ajout-section-k8s
# Merge made by the 'ort' strategy.
# 9. Supprimer la branche
git branch -d feature/ajout-section-k8s
# 10. Historique final
git log --oneline --graph
# * ghi789 (HEAD -> main) Merge branch 'feature/ajout-section-k8s'
# |\
# | * jkl012 merge: Résolution conflit docker.md
# | * mno345 docs: Ajout section configuration
# * | pqr678 docs: Ajout section installation
# |/
# * abc123 docs: Ajout section Docker
Explications :
git switch -c: Créer et basculer vers une branchegit merge: Fusionner une branche dans la branche active- Fast-forward : Merge simple (pas de divergence)
- Merge commit : Commit spécial créé lors d'un merge avec divergence
HEAD~1: Référence au commit parent (1 commit avant HEAD)- Marqueurs de conflit :
<<<<<<< HEAD(votre version) vs>>>>>>> branch(version à merger)
Validation
Vous maîtrisez maintenant le workflow feature branch ! Vous savez créer des branches, les merger, et résoudre des conflits.
Points Clés à Retenir
Ce module vous a appris :
- 🌿 Branches : Lignes de développement parallèles pour isoler le travail
- 🔀 git switch : Commande moderne pour changer de branche (remplace checkout)
- 🚀 Feature Branch Workflow : Créer → Commit → Push → PR → Merge → Delete
- ⚠️ Conflits : Se produisent quand 2 branches modifient les mêmes lignes
- 🔧 Résolution : Éditer manuellement, choisir une version, puis
git add+git commit - 📊 Git Flow : Stratégie complexe avec 5 types de branches (main, develop, feature, release, hotfix)
- ⚡ GitHub Flow : Stratégie simple avec 2 types (main, feature) pour déploiement continu
- 🎯 Pull Request : Mécanisme de review avant merge (GitHub/GitLab)
Commandes Essentielles :
git branch # Lister les branches
git switch -c feature/nom # Créer et basculer
git merge feature/nom # Merger dans la branche active
git branch -d feature/nom # Supprimer une branche locale
git push origin --delete nom # Supprimer une branche remote
Prochaine étape : Module 3 : Pipeline CI/CD avec GitLab (en cours de rédaction)
Retour au : Programme de la Formation | Catalogue
Navigation
| ← Module 1 : Comprendre Git | Module 3 : Mon Premier Pipeline CI/CD → |