Git protip : ajouter en un clin d’œil des modifs oubliées à un vieux commit
Par Maxime Bréhin • Publié le 17 octobre 2022 • 2 min

Combien de fois as-tu oublié d’ajouter un fichier pour découvrir ton erreur plus tard, après quelques commits ?

Perso, je suis un fervent défenseur des commits atomiques qui sont, je pense, une des clés de la qualité et de l’automatisation des projets (regarde par exemple Conventional Commit et Semantic Release). Du coup, je fais de mon mieux pour corriger ces commits en utilisant le rebase interactif, et je ne peux que t’encourager à faire de même !

Mon objectif est de te permettre de faire ça le plus rapidement possible, que ça devienne un reflexe !

Tu connais peut-être déjà l’option git commit --fixup (ou --squash) qui crée un commit dont l’intitulé signale qu’il corrige un autre commit ? Grâce à ça, si tu lances un rebase interactif, il viendra automatiquement placer l’application du commit en fixup sous la ligne du commit à corriger 😎 !

La procédure complète

Tu ajoutes tes fichiers oubliés au stage.

Tu fais un git commit --fixup=<ref-du-commit-à-corriger>.

Tu lances ton rebase interactif en partant du commit précédent celui à corriger : git rebase --autosquash -i -r <ref-du-commit-à-corriger>~1.

Ton éditeur s’ouvre, te propose la liste des actions à réaliser avec le fixup au bon endroit. Tu n’as plus qu’à enregistrer et fermer ce fichier, et le tour est joué ! Pense à vérifier ton log pour être sûr que tout est bon, éventuellement en faisant un git show --name-only <ref-du-nouveau-commit> pour vérifier la liste des fichiers impactés par le commit corrigé.

pick 3f0714b chore(dx): setup ESLint and Prettier
fixup 61eecda fixup! chore(dx): setup ESLint and Prettier
pick 9a7cf39 chore(dx): setup Husky, lint-staged, precommit-checks, commitlint

Comme ça m’arrive de temps en temps, je me suis fait un alias “magique” 🧙‍♂️ qui consiste à appeler ces deux commandes en une fois (pour corriger un seul commit) :

# N’oublie pas d’ajouter tes fichiers dans le *stage* avant de lancer la commande
git config --global alias.autofixup '!git commit --fixup $1 && git rebase --autosquash --interactive --rebase-merges $1~1 && echo "autofixup finished"'

Et voilà !

Tu veux aller plus loin et maîtriser pleinement les fondamentaux de Git ou être accompagné pour garantir la qualité de tes projets grâce à une bonne mise en place de Git ? On peut t’aider ou te former, il suffit de nous décrire ton besoin !