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