← retour aux snippets

git: corriger un ancien commit avec fixup/autosquash

Créer un fixup et réécrire l'historique proprement avec rebase interactif autosquash.


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 --autosquash repositionne automatiquement.
  • choisissez une base de rebase qui couvre le commit ciblé (ex: HEAD~N ou origin/main).
  • préférez --force-with-lease pour éviter d’écraser le travail d’autrui lors du push.
  • utilisez :/pattern pour cibler un commit par recherche textuelle dans son message.
  • si le rebase bloque sur un conflit, résolvez, git add -A, puis git rebase --continue.