Git: как изменить сообщение коммита — последнего и старого

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

Сообщение последнего коммита меняется командой git commit --amend -m "Новое сообщение". Для более старого коммита нужен интерактивный git rebase -i с действием reword. Если коммит уже отправлен на сервер, потребуется принудительная отправка.

Изменить последний коммит

Bash
git commit --amend -m "Исправлена проверка пароля"   # заменить сообщение
git commit --amend                                   # открыть редактор с текущим сообщением
git log -1 --format=%s                               # проверить результат

Команда создаёт новый коммит вместо старого, поэтому у него изменится хеш.

Изменить старый коммит

Допустим, нужно поправить третий коммит от конца. Откройте интерактивный режим с этим диапазоном:

Bash
git rebase -i HEAD~3

В открывшемся списке замените слово pick на reword у нужного коммита, сохраните файл. Git остановится на этом коммите и откроет редактор с его сообщением. После сохранения остальные коммиты будут перенесены автоматически.

Те же шаги без ручного редактирования, например в скрипте:

Bash
GIT_SEQUENCE_EDITOR="sed -i '1s/^pick/reword/'" \
GIT_EDITOR="sh -c 'echo \"Новое сообщение\" > \"\$1\"' --" \
git rebase -i HEAD~3

Изменить автора коммита

Bash
git commit --amend --no-edit --author="Иван Петров <ivan@example.com>"

Если коммит уже отправлен на сервер

Перепишите историю и отправьте её принудительно, но с защитой от перезаписи чужой работы:

Bash
git push --force-with-lease

Как отменить исправление

Старый коммит остаётся в журнале reflog и его можно вернуть:

Bash
git reflog                      # найдите запись «commit (amend)» и коммит перед ней
git reset --hard HEAD@{1}       # вернуть состояние до исправления

Частые вопросы

Можно ли изменить сообщение первого коммита в репозитории?

Да, используйте git rebase -i --root: в списке появится самый первый коммит.

Чем reword отличается от amend?

amend работает только с последним коммитом. reword внутри rebase -i позволяет изменить сообщение любого коммита из выбранного диапазона.