W3docs

git commit --amend

Полезная информация о команде git commit --amend: способы применения и практические примеры использования.

Что делает git commit --amend

После коммита легко заметить опечатку в сообщении или обнаружить, что вы забыли добавить файл. Команда git commit --amend — самый быстрый способ исправить такие ошибки: она позволяет редактировать самый последний коммит в текущей ветке.

Вместо того чтобы создавать небольшой дополнительный коммит поверх предыдущего, флаг --amend объединяет проиндексированные изменения (и, при необходимости, новое сообщение) с предыдущим коммитом. В результате получается единый, аккуратный коммит, как будто вы с первого раза всё сделали правильно.

git commit --amend

Это заменяет коммит, а не редактирует его

Это самое важное, что нужно понимать о --amend. Коммиты Git неизменяемы, поэтому Git не может действительно изменить существующий коммит. Вместо этого --amend создаёт совершенно новый коммит из текущего дерева плюс родительский элемент старого коммита, а затем перемещает на него указатель ветки. Исходный коммит остаётся «висящим» (без ссылок) до тех пор, пока сборщик мусора его не удалит.

Поскольку новый коммит содержит другой снимок и/или сообщение, он получает другой хеш. Этот единственный факт объясняет все приведённые ниже правила, включая то, почему изменение общих коммитов опасно.

Изменение сообщения последнего коммита

Если вы создали коммит с неверным или неясным сообщением, выполните git commit --amend, чтобы переписать его без изменения снимка. Передайте новое сообщение прямо в командной строке с помощью -m, чтобы пропустить редактор:

git commit --amend -m "Fix typo in login validation"

Если выполнить git commit --amend без параметров, Git откроет редактор с предзаполненным старым сообщением для интерактивного редактирования. Это удобно для длинных сообщений с описанием.

Добавление забытых изменений в последний коммит

Предположим, вы собирались зафиксировать два файла в одном снимке, но забыли проиндексировать один из них. Добавьте пропущенный файл в индекс, а затем выполните amend:

# You edit project.py and text.py, but only commit project.py
git add project.py
git commit -m "Add data processing helpers"

# You realize text.py belongs in that same commit
git add text.py
git commit --amend --no-edit

Флаг --no-edit сохраняет существующее сообщение коммита, поэтому Git молча включает только что проиндексированный text.py в предыдущий коммит. Без --no-edit откроется редактор, в котором можно одновременно обновить сообщение.

Можно совместить оба действия: изменить сообщение и добавить забытые файлы за один раз.

git add forgotten-file.js
git commit --amend -m "Add feature with all required files"

Проверка результата с помощью git log

После внесения изменений проверьте ветку с помощью git log, чтобы убедиться, что хеш изменился и старый коммит исчез из истории:

git log --oneline -1

Другой короткий хеш рядом с вашим сообщением подтверждает, что amend создал новый коммит, а не отредактировал старый на месте.

Распространённые ошибки

  • --amend затрагивает только последний коммит. Чтобы переписать более ранний коммит, используйте интерактивный rebase (git rebase -i).
  • Всё, что не проиндексировано, исключается. Amend фиксирует текущий индекс, поэтому непроиндексированные изменения остаются незафиксированными. Сначала выполните git add.
  • Дата автора сохраняется по умолчанию, но дата коммитера обновляется. Добавьте --reset-author, если хотите обновить идентификатор и дату автора.

Избегайте изменения запушенных коммитов

Поскольку amend создаёт коммит с новым хешем, переписанный коммит больше не совпадает с тем, что другие разработчики уже получили. Никогда не изменяйте коммит, который уже был отправлен и передан коллегам: их история по-прежнему указывает на старый хеш, и обычный git push будет отклонён. Принудительный push (git push --force) может перезаписать или продублировать их работу.

Эта опасность аналогична сбросу публичного снимка: оба способа переписывают историю, на которую опираются другие. Используйте --amend только для локальных, неотправленных коммитов — и проблем не возникнет.

Внимание

Изменяйте только те коммиты, которые существуют исключительно на вашем компьютере. Как только коммит отправлен и получен другими разработчиками, его переписывание с помощью --amend нарушит их историю.

Практика

Практика
Какие утверждения о команде `git commit --amend` верны?
Какие утверждения о команде `git commit --amend` верны?
Was this page helpful?