Git commit --fixup: исправить коммит через autosquash

Категория: Git · Язык: Bash · Обновлено:

git commit --fixup=<commit> создаёт коммит с сообщением fixup! <тема целевого коммита>. При интерактивном rebase с --autosquash Git сам ставит его сразу после целевого и помечает как fixup, поэтому отдельный коммит не попадает в итоговую историю. Это удобнее, чем вручную искать нужный коммит в списке rebase.

Исправить коммит в середине ветки

Bash
git add src/api.py
git commit --fixup=HEAD~2
GIT_SEQUENCE_EDITOR=true git rebase -i --autosquash HEAD~3

HEAD~2 — целевой коммит, а базой rebase служит коммит перед ним (HEAD~3). GIT_SEQUENCE_EDITOR=true отключает редактор и подтверждает предложенный порядок; без переменной Git откроет редактор, где можно проверить расстановку. После rebase содержимое fixup-коммита сливается с целевым, а сообщение целевого сохраняется.

--fixup не меняет историю сразу: до rebase это обычный коммит с префиксом fixup!. Если в ветке несколько таких коммитов, autosquash разложит их по целевым. Конфликты решаются как при обычном rebase: исправьте файлы, выполните git add и git rebase --continue.

Обновить и сообщение коммита

Bash
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.