objectif
Ajouter un correctif à un ancien commit sans tout casser: créer un commit “fixup!” ciblé puis laisser git le fusionner au bon endroit via un rebase interactif avec autosquash.
code minimal
# 1) préparez vos changements puis créez un commit fixup ciblant le commit à corriger
git add -A
git commit --fixup=<commit>
# 2) réécrivez l'historique en replaçant automatiquement le fixup au bon endroit
git rebase -i --autosquash <base>
utilisation
# cibler le commit par son hash court
git add -A
git commit --fixup=abc1234
# cibler par recherche dans le message (:/pattern)
git add -A
git commit --fixup=:/init database schema
# définir la base du rebase:
# - sur les 10 derniers commits
git rebase -i --autosquash HEAD~10
# - ou par rapport à la branche distante (range plus sûr)
git rebase -i --autosquash origin/main
# si l'arbre de travail a des changements non indexés, stash auto pendant le rebase
git rebase -i --autosquash --autostash origin/main
# après rebase, pousser l'historique réécrit (branche partagée: prudence)
git push --force-with-lease
variante(s) utile(s)
# créer un fixup en ajoutant seulement une partie des changements (stage interactif)
git add -p
git commit --fixup=:/refactor user service
# créer plusieurs fixups avant un seul rebase
git commit --fixup=hash1
git commit --fixup=hash2
git rebase -i --autosquash HEAD~20
# transformer un fixup en squash (garder/éditer le message)
# (pendant l'écran du rebase interactif, changez "fixup" -> "squash" si souhaité)
# corriger le N-ième commit en partant de HEAD (ex: HEAD~5)
git commit --fixup=HEAD~5
git rebase -i --autosquash HEAD~6
# signer le fixup si vous signez vos commits
git commit -S --fixup=:/add payment webhook
# rebase de branches avec merges (git récent)
git rebase -i -r --autosquash origin/main
notes
git commit --fixup=<commit>crée un message “fixup! <message d’origine>” que--autosquashrepositionne automatiquement.- choisissez une base de rebase qui couvre le commit ciblé (ex:
HEAD~Nouorigin/main). - préférez
--force-with-leasepour éviter d’écraser le travail d’autrui lors du push. - utilisez
:/patternpour cibler un commit par recherche textuelle dans son message. - si le rebase bloque sur un conflit, résolvez,
git add -A, puisgit rebase --continue.