Cette fois-ci voici un moyen simple pour corriger un commit au milieu de votre historique avant de le partager. L’idée étant de corriger le commit existant et non de rajouter des nouveaux commits. (Merci Aurélien pour cette idée d’article !)
Comment ça fonctionne
Prenons l’exemple d’une branche de travail, feature/api. Je ne suis pas satisfaite du commit B et je souhaite le corriger.
- Créer un commit correctif depuis le dernier commit réalisé (HEAD). Ce commit est un peu particulier dans la mesure où il sagit d’un commit temporaire dont le message sera créé automatiquement (fixup)
- Lancer un rebase interactif avec l’option autosquash. Le commit de correction sera automatiquement positionné de manière à être fusionné avec B.
- Finaliser le rebase interactif. Le commit fixup a disparu et ma modification a été intégrée à B
Bien sûr, le rebase interactif étant un outil de réécriture d’historique, les commits B et tous ses successeurs auront changé d’identité. Attention donc à éviter de réécrire un historique déjà partagé (sauf si vous travaillez seul sur cette branche).

Les commandes
Voyons tout ça maintenant en commandes et à partir d’un petit exemple !
1 – Définir le commit à corriger
[ennael@zarafa lab-git (devel)]$ git log --oneline
af522a9 (HEAD -> devel) Add todo list
700b44e Add isc license file
6b7c25f Fix title et add more documentation
f3150b6 Add lib/fic4 library <----- commit à corriger
1d05b4b Add lib/fic3 library
2 – Créer le correctif
La correction sera committée en utilisant l’option –fixup=<SHA1 du commit à corriger>
[ennael@zarafa lab-git (devel)]$ vi lib/fic4
[ennael@zarafa lab-git (devel)]$ git add lib/fic4
[ennael@zarafa lab-git (devel)]$ git commit --fixup=f3150b6
[devel 5b360c8] fixup! Add lib/fic4 library
1 file changed, 1 insertion(+)
[ennael@zarafa lab-git (devel)]$ git log --oneline
5b360c8 (HEAD -> devel) fixup! Add lib/fic4 library
af522a9 Add todo list
700b44e Add isc license file
3 – Lancer le rebase interactif
Ne pas oublier l’option –autosquash
[ennael@zarafa lab-git (devel)]$ git rebase -i --autosquash f3150b6~1
Rien à faire ici, juste à valider l’opération de fusion des commits
pick f3150b6 Add lib/fic4 library
fixup 5b360c8 fixup! Add lib/fic4 library
pick 6b7c25f Fix title et add more documentation
pick 700b44e Add isc license file
pick af522a9 Add todo list
4 – Tadaaaa le résultat !
Le tour est joué, mon correctif est intégré et mon historique a été réécrit !
[ennael@zarafa lab-git (devel)]$ git log --oneline
3eaccfd (HEAD -> devel) Add todo list
405aa43 Add isc license file
e5d2b75 Fix title et add more documentation
c4fa3b5 Add lib/fic4 library
1d05b4b Add lib/fic3 library
Cool non ? Allez on récapitule !
Identifier le commit à corriger
git log --oneline
Créer et committer un commit correctif temporaire
git commit --fixup=<SHA1 du commit à corriger>
Lancer le rebase interactif
git rebase -i --autosquash <SHA1 du commit à corriger>~1
Valider la fusion
Utiliser systématiquement autosquash lors d’un rebase interactif
git config --global rebase.autoSquash true
0 commentaires