Git commit --fixup: исправить коммит через autosquash
git commit --fixup=<commit> создаёт коммит с сообщением fixup! <тема целевого коммита>. При интерактивном rebase с --autosquash Git сам ставит его сразу после целевого и помечает как fixup, поэтому отдельный коммит не попадает в итоговую историю. Это удобнее, чем вручную искать нужный коммит в списке rebase.
Исправить коммит в середине ветки
git add src/api.py
git commit --fixup=HEAD~2
GIT_SEQUENCE_EDITOR=true git rebase -i --autosquash HEAD~3HEAD~2 — целевой коммит, а базой rebase служит коммит перед ним (HEAD~3). GIT_SEQUENCE_EDITOR=true отключает редактор и подтверждает предложенный порядок; без переменной Git откроет редактор, где можно проверить расстановку. После rebase содержимое fixup-коммита сливается с целевым, а сообщение целевого сохраняется.
--fixup не меняет историю сразу: до rebase это обычный коммит с префиксом fixup!. Если в ветке несколько таких коммитов, autosquash разложит их по целевым. Конфликты решаются как при обычном rebase: исправьте файлы, выполните git add и git rebase --continue.
Обновить и сообщение коммита
git commit --fixup=amend:HEAD~2
git rebase -i --autosquash HEAD~3Форма amend: появилась в Git 2.32: она заменяет не только содержимое, но и сообщение целевого коммита. --fixup=reword:<commit> меняет только сообщение. Для старых версий Git используйте git commit --fixup и git rebase -i, вручную заменив pick на reword.
Включить autosquash по умолчанию можно через git config rebase.autosquash true. Не переписывайте опубликованную ветку без согласования: rebase меняет хеши, и коллегам придётся заново синхронизироваться. Для общей ветки используйте отдельную feature-ветку и force push только с --force-with-lease.
Проверить результат до отправки: git log --oneline --decorate -5 и git show HEAD~1. Если fixup попал не туда, git reflog поможет вернуться к состоянию до rebase.
Документация: git commit, git rebase.