git commit --amend: поправить последний коммит
Обновлено 31 июля 2026 г.
git commit --amend заменяет последний коммит новым: с исправленным сообщением, с забытым файлом или с тем и другим сразу.
Ситуация обычная: закоммитил, а через минуту заметил опечатку в сообщении или файл, который забыл добавить. Заводить ради этого второй коммит «поправил предыдущий» незачем.
Забытый файл кладёшь в индекс и повторяешь коммит с флагом --no-edit, чтобы сообщение осталось прежним:
$ git add images.txt
$ git commit --amend --no-edit
[main 02990aa] глава про сроки
Date: Tue Mar 17 12:04:31 2026 +0300
2 files changed, 2 insertions(+)
create mode 100644 chapter.txt
create mode 100644 images.txtСообщение правишь тем же --amend, только с новым текстом:
$ git commit --amend -m "глава про сроки сдачи"Без -m и без --no-edit git откроет редактор со старым сообщением: удобно, когда нужно дописать тело, а не заменить строку целиком.
Что при этом происходит
Старый коммит не редактируется, его нельзя изменить в принципе. Git собирает новый снимок из текущего индекса, приписывает ему сообщение и переставляет ветку на него. Хеш получается другой, потому что содержимое другое:
$ git log --oneline
02990aa глава про сроки # до --amend тут был 8f1c4d2
a70cfa7 отчёт: первая версияПрежний коммит какое-то время остаётся в базе, но на него больше ничто не указывает. Если --amend сделан по ошибке, найди его в выводе git reflog и вернись на нужный хеш.
Почему нельзя менять отправленный коммит
Пока коммит живёт только у тебя на машине, --amend безопасен. Отправленный на сервер коммит уже мог кто-то забрать, и подмена разойдётся с чужой историей. Сервер такой push просто не примет:
$ git push origin main
To github.com:anna/report.git
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs to 'github.com:anna/report.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart.Он прав: у него лежит коммит, которого в твоей истории больше нет. Продавить это можно через git push --force, и в своей личной ветке, которую никто не забирал, это терпимо. В общей ветке --force стирает историю сразу у всех, кто с ней работает, поэтому там правильный ход другой - обычный новый коммит поверх.
Частые ошибки
--amend без git add меняет только сообщение: правки на диске в коммит не попадут, если не положить их в индекс. Флаг работает лишь с последним коммитом, для более старых нужен git rebase -i. И правило про «доделать»: если между коммитом и правкой прошла отдельная работа, делай новый коммит, а не расширяй старый.
Где это в учебнике
Подробный разбор - Глава 4. Посмотреть, отменить, спрятать лишнее. Рядом пригодятся commit message и git reflog.
Потренироваться руками - в интерактивном уроке Отмена изменений.