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.

Потренироваться руками - в интерактивном уроке Отмена изменений.