Aller au contenu principal

Utilisation de Git Squash


Table des matières


  1. Qu'est-ce que le Squash ?
  2. Pourquoi utiliser Squash ?
  3. Méthode 1 : Rebase interactif
  4. Méthode 2 : Merge --squash
  5. Méthode 3 : Reset + Commit
  6. Exercice pratique
  7. 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

SituationPourquoi Squash
Commits "WIP"Nettoyer avant merge
"fix typo" répétésHistorique professionnel
Plusieurs petits commitsUn seul commit cohérent
Avant une Pull RequestCode 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

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

CommandeAction
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

  1. Git prépare tous les changements de la branche feature/login
  2. Ces changements sont mis en staging
  3. Vous créez un seul commit avec tous les changements
  4. 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

OptionWorking DirectoryStaging AreaHistorique
--softPréservéPréservéRéécrit
--mixed (défaut)PréservéResetRéécrit
--hardResetResetRéé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 PRSur des commits déjà partagés
Commits WIP locauxSur des merge commits
Nettoyage de brancheSur main/master
Avant de partagerSi 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

🔝 Retour à la table des matières