Étude de Cas : Merge et Rebase
Table des matières
- Introduction
- Scénario de base
- Option 1 : Git Merge
- Option 2 : Git Rebase
- Comparaison visuelle
- Quand utiliser quoi ?
- Exercice pratique
1 - Introduction
Quand plusieurs personnes travaillent sur un projet, les branches divergent. Pour intégrer les changements, deux options principales existent :
- Merge : Fusionne les branches en créant un commit de merge
- Rebase : Réécrit l'historique pour linéariser les commits
💡 C'est l'un des sujets les plus débattus dans la communauté Git !
🔝 Retour à la table des matières
2 - Scénario de base
Situation initiale
Vous travaillez sur une feature branch feature/login pendant que main a évolué :
A---B---C feature/login
/
D---E---F---G main
- D, E : Commits initiaux sur main
- A, B, C : Vos commits sur feature/login
- F, G : Nouveaux commits sur main (faits par d'autres)
Le problème
Votre branche feature/login n'a pas les dernières modifications de main. Il faut intégrer ces changements.
🔝 Retour à la table des matières
3 - Option 1 : Git Merge
Comment ça marche
Le merge crée un commit de fusion qui combine les deux branches :
git checkout feature/login
git merge main
Résultat
A---B---C---M feature/login
/ /
D---E---F---G--- main
M est le commit de merge qui a deux parents : C et G.
Avantages du Merge
| Avantage | Description |
|---|---|
| ✅ Historique préservé | On voit exactement quand les branches ont été fusionnées |
| ✅ Sécurité | Pas de réécriture d'historique |
| ✅ Traçabilité | Facile de comprendre le flux de travail |
| ✅ Réversible | On peut annuler un merge |
Inconvénients du Merge
| Inconvénient | Description |
|---|---|
| ❌ Historique chargé | Beaucoup de commits de merge |
| ❌ Graphe complexe | Difficile à lire avec git log --graph |
Commandes Merge
# Se placer sur la branche cible
git checkout feature/login
# Merger main dans feature/login
git merge main
# En cas de conflits, résoudre puis :
git add .
git commit
🔝 Retour à la table des matières
4 - Option 2 : Git Rebase
Comment ça marche
Le rebase déplace vos commits à la pointe de main :
git checkout feature/login
git rebase main
Résultat
A'--B'--C' feature/login
/
D---E---F---G main
Les commits A, B, C sont recréés comme A', B', C' avec de nouveaux hashes.
Avantages du Rebase
| Avantage | Description |
|---|---|
| ✅ Historique linéaire | Graphe propre et facile à lire |
| ✅ Pas de merge commits | Historique épuré |
| ✅ Facile à suivre | L'ordre des commits est logique |
Inconvénients du Rebase
| Inconvénient | Description |
|---|---|
| ❌ Réécrit l'historique | Dangereux si déjà partagé |
| ❌ Conflits multiples | Peut nécessiter de résoudre les conflits plusieurs fois |
| ❌ Hashes modifiés | Les commits ont de nouveaux identifiants |
Commandes Rebase
# Se placer sur la branche à rebaser
git checkout feature/login
# Rebaser sur main
git rebase main
# En cas de conflits, résoudre puis :
git add .
git rebase --continue
# Pour annuler le rebase
git rebase --abort
🔝 Retour à la table des matières
5 - Comparaison visuelle
Avant (situation initiale)
A---B---C feature/login
/
D---E---F---G main
Après Merge
A---B---C---M feature/login
/ /
D---E---F---G--- main
Après Rebase
A'--B'--C' feature/login
/
D---E---F---G main
Tableau comparatif
| Aspect | Merge | Rebase |
|---|---|---|
| Historique | Non-linéaire | Linéaire |
| Commits supplémentaires | Oui (merge commit) | Non |
| Hashes préservés | ✅ Oui | ❌ Non |
| Sécurité | ✅ Haute | ⚠️ Risquée si partagée |
| Traçabilité | ✅ Complète | Partielle |
| Lisibilité | Moyenne | ✅ Excellente |
🔝 Retour à la table des matières
6 - Quand utiliser quoi ?
Utilisez MERGE quand :
- ✅ La branche a été partagée (push sur GitHub)
- ✅ Vous voulez préserver l'historique exact
- ✅ Vous travaillez en équipe sur la même branche
- ✅ Vous intégrez une feature terminée dans main
- ✅ Vous n'êtes pas sûr
Utilisez REBASE quand :
- ✅ La branche est locale (jamais partagée)
- ✅ Vous voulez un historique propre avant un merge
- ✅ Vous mettez à jour votre branche avec main
- ✅ Vous nettoyez vos commits avant une PR
Règle d'or
⚠️ NE JAMAIS rebaser une branche publique !
Si d'autres personnes travaillent dessus, utilisez merge.
Workflow recommandé
# 1. Mettre à jour main
git checkout main
git pull
# 2. Rebaser votre feature branch (si locale)
git checkout feature/login
git rebase main
# 3. Une fois terminé, merger dans main
git checkout main
git merge feature/login # Fast-forward possible !
# 4. Pousser
git push origin main
🔝 Retour à la table des matières
7 - Exercice pratique
Mise en place
# Créer un dépôt de test
mkdir test-merge-rebase
cd test-merge-rebase
git init
# Créer des commits sur main
echo "Initial" > file.txt
git add file.txt
git commit -m "Initial commit"
echo "Line 2" >> file.txt
git commit -am "Add line 2"
# Créer une branche feature
git checkout -b feature/test
echo "Feature line" >> file.txt
git commit -am "Add feature line"
# Retourner sur main et ajouter un commit
git checkout main
echo "Main line" >> file.txt
git commit -am "Add main line"
Tester le Merge
git checkout feature/test
git merge main
git log --oneline --graph
Tester le Rebase (refaire la mise en place d'abord)
git checkout feature/test
git rebase main
git log --oneline --graph
Observer la différence
Comparez les deux historiques avec git log --oneline --graph --all.