Git : Fusionner des Commits (Squash)
Dernière mise à jour
Le squash combine plusieurs commits en un seul, de sorte qu'une série désordonnée de commits "wip", "corrige la faute", "cette fois c'est bon" devient un unique commit propre. L'outil habituel est le rebase interactif - git rebase -i - où tu marques les commits à regrouper. Comme le squash réécrit l'historique, fais-le avant de pousser, ou sur une branche sur laquelle tu es seul à travailler.
Essaie ces commandes dans le terminal playground - un vrai shell dans ton navigateur, rien à installer.
Syntaxe
| Command | What it does |
|---|---|
git rebase -i HEAD~3 | Rebase interactif des 3 derniers commits |
git rebase -i main | Rebase chaque commit depuis main |
git merge --squash feature | Fusionne les commits d'une branche en un seul lors du merge |
git reset --soft HEAD~3 && git commit | Fusionne les 3 derniers commits sans rebase |
Commandes du rebase interactif
Dans l'éditeur qui s'ouvre, remplace pick par l'une de celles-ci.
| Keyword | What it does |
|---|---|
pick | Garde le commit tel quel |
squash (s) | Fusionne avec le commit précédent et combine les messages |
fixup (f) | Fusionne mais supprime le message de ce commit |
reword (r) | Garde le commit mais modifie son message |
Exemple concret
Fusionne les trois derniers commits en un seul avant de pousser.
| Step | Action | Result |
|---|---|---|
| 1 | git rebase -i HEAD~3 | Ouvre les 3 derniers commits dans l'éditeur |
| 2 | Définis les commits 2 et 3 sur squash | Les marque pour être fusionnés dans le premier |
| 3 | Enregistre et modifie le message combiné | Trois commits deviennent un commit propre |
FAQ sur le squash de commits Git
Comment fusionner les N derniers commits dans Git ?
git rebase -i HEAD~N (par exemple HEAD~3 pour les trois derniers). Dans l'éditeur, laisse le premier commit en pick et remplace les autres par squash (ou fixup pour supprimer leurs messages). Enregistre, modifie le message de commit combiné, et les commits se regroupent en un seul.Quelle est la différence entre squash et fixup ?
squash conserve le message du commit et te permet de le combiner avec les autres dans un éditeur. fixup supprime entièrement le message du commit et ne garde que celui du commit précédent - pratique pour les commits "oups, petite correction" que tu ne veux pas dans le message final.Comment fusionner toute une branche lors d'un merge ?
git merge --squash feature, puis git commit. Cela applique toutes les modifications de la branche comme des changements indexés (staged) et te permet de les enregistrer en un seul commit sur la branche cible, sans reprendre les commits individuels de la branche. Le bouton "Squash and merge" de GitHub fait la même chose.Puis-je fusionner sans rebase interactif ?
git reset --soft HEAD~N ramène la branche N commits en arrière tout en gardant toutes leurs modifications indexées (staged), puis un unique git commit les enregistre en un seul. C'est un moyen rapide de fusionner les commits les plus récents sans ouvrir l'éditeur de rebase.