Utilisation de Git Squash
Table des matières
- Qu'est-ce que le Squash ?
- Pourquoi utiliser Squash ?
- Méthode 1 : Rebase interactif
- Méthode 2 : Merge --squash
- Méthode 3 : Reset + Commit
- Exercice pratique
- Bonnes pratiques
1 - Qu'est-ce que le Squash ?
Le squash permet de combiner plusieurs commits en un seul commit.
Avant le squash
A---B---C---D---E feature
| | | |
| | | └── "fix typo"
| | └────── "fix bug"
| └────────── "wip"
└────────────── "feat: login page"
Après le squash
A---F feature
|
└── "feat: implement login page"
Les commits B, C, D, E sont combinés en un seul commit F.
🔝 Retour à la table des matières
2 - Pourquoi utiliser Squash ?
Cas d'usage typiques
| Situation | Pourquoi Squash |
|---|---|
| Commits "WIP" | Nettoyer avant merge |
| "fix typo" répétés | Historique professionnel |
| Plusieurs petits commits | Un seul commit cohérent |
| Avant une Pull Request | Code review facilitée |
Avantages
- ✅ Historique plus lisible
- ✅ Chaque commit représente une fonctionnalité complète
- ✅ Facilite le revert (un seul commit à annuler)
- ✅ Code review plus simple
Attention
⚠️ Ne jamais squash des commits déjà poussés sur une branche partagée !
🔝 Retour à la table des matières
3 - Méthode 1 : Rebase interactif
C'est la méthode la plus courante et la plus flexible.
Syntaxe
git rebase -i HEAD~N
Où N est le nombre de commits à modifier.
Exemple concret
Supposons ces 4 commits :
git log --oneline
# e1f2g3h fix: typo in login
# a1b2c3d wip
# x1y2z3a feat: add login form
# m1n2o3p Initial commit
Pour squash les 3 derniers commits :
git rebase -i HEAD~3
L'éditeur s'ouvre
pick x1y2z3a feat: add login form
pick a1b2c3d wip
pick e1f2g3h fix: typo in login
# Rebase m1n2o3p..e1f2g3h onto m1n2o3p (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
Modifier pour squash
Remplacez pick par squash (ou s) pour les commits à fusionner :
pick x1y2z3a feat: add login form
squash a1b2c3d wip
squash e1f2g3h fix: typo in login
Résultat
Git vous demande d'écrire un nouveau message de commit. Les 3 commits sont fusionnés en un seul !
Commandes utiles dans le rebase interactif
| Commande | Action |
|---|---|
pick (p) | Garder le commit tel quel |
reword (r) | Modifier le message |
edit (e) | Arrêter pour modifier |
squash (s) | Fusionner avec le précédent, combiner les messages |
fixup (f) | Fusionner avec le précédent, ignorer le message |
drop (d) | Supprimer le commit |
🔝 Retour à la table des matières
4 - Méthode 2 : Merge --squash
Cette méthode squash une branche entière lors du merge.
Syntaxe
git checkout main
git merge --squash feature/login
git commit -m "feat: implement login feature"
Ce qui se passe
- Git prépare tous les changements de la branche
feature/login - Ces changements sont mis en staging
- Vous créez un seul commit avec tous les changements
- La branche feature/login reste intacte
Avantages
- ✅ Simple et rapide
- ✅ Pas de rebase interactif
- ✅ Idéal pour les feature branches
Attention
Après un merge squash, la branche feature n'est PAS fusionnée au sens Git :
# La branche feature/login apparaîtra toujours comme non-mergée
git branch --merged # feature/login n'y sera pas
Il faut la supprimer manuellement :
git branch -D feature/login
🔝 Retour à la table des matières
5 - Méthode 3 : Reset + Commit
Une méthode simple mais moins élégante.
Syntaxe
# Reset au commit de départ (garder les modifications)
git reset --soft HEAD~N
# Recréer un seul commit
git commit -m "feat: nouvelle fonctionnalité complète"
Exemple
# Revenir 3 commits en arrière
git reset --soft HEAD~3
# Vérifier les fichiers en staging
git status
# Créer un nouveau commit
git commit -m "feat: implement complete feature"
Les types de Reset
| Option | Working Directory | Staging Area | Historique |
|---|---|---|---|
--soft | Préservé | Préservé | Réécrit |
--mixed (défaut) | Préservé | Reset | Réécrit |
--hard | Reset | Reset | Réécrit |
⚠️ Attention avec
--hard: vous perdez les modifications !
🔝 Retour à la table des matières
6 - Exercice pratique
Mise en place
# Créer un dépôt de test
mkdir test-squash
cd test-squash
git init
# Créer plusieurs commits
echo "Line 1" > file.txt
git add file.txt
git commit -m "feat: initial file"
echo "Line 2" >> file.txt
git commit -am "wip"
echo "Line 3" >> file.txt
git commit -am "more wip"
echo "Line 4" >> file.txt
git commit -am "fix typo"
echo "Line 5" >> file.txt
git commit -am "final touches"
Vérifier l'historique
git log --oneline
Vous devriez voir 5 commits.
Squash les 4 derniers commits
git rebase -i HEAD~4
Dans l'éditeur, gardez le premier en pick et changez les autres en squash :
pick abc1234 wip
squash def5678 more wip
squash ghi9012 fix typo
squash jkl3456 final touches
Écrire le nouveau message
Quand l'éditeur s'ouvre, remplacez tout par :
feat: implement complete feature
This commit includes:
- Initial implementation
- Bug fixes
- Final touches
Vérifier le résultat
git log --oneline
Vous devriez maintenant voir seulement 2 commits !
🔝 Retour à la table des matières
7 - Bonnes pratiques
Quand faire un Squash ?
| ✅ Faire | ❌ Ne pas faire |
|---|---|
| Avant une PR | Sur des commits déjà partagés |
| Commits WIP locaux | Sur des merge commits |
| Nettoyage de branche | Sur main/master |
| Avant de partager | Si d'autres travaillent dessus |
Workflow recommandé
# 1. Développer avec plusieurs petits commits
git commit -m "wip: start feature"
git commit -m "wip: add validation"
git commit -m "fix: handle edge case"
# 2. Avant de créer la PR, squash
git rebase -i HEAD~3
# 3. Un seul commit propre
git push origin feature/my-feature
# 4. Créer la PR sur GitHub
Messages de commit après squash
Profitez du squash pour écrire un bon message :
feat: implement user authentication
- Add login form with email/password
- Implement JWT token handling
- Add remember me functionality
- Handle authentication errors
Closes #123