git commit - момент, когда «правки» становятся «историей». Берёт
снимок индекса (не рабочего дерева!) и упаковывает в commit-объект.
Что происходит при коммите
- Из индекса собирается tree-объект (через
write-tree). - Создаётся commit-объект: tree + родитель (HEAD) + author + committer + сообщение. Author - кто написал изменения, committer - кто их зафиксировал; обычно совпадают, но при rebase/cherry-pick/apply от patch'а committer обновляется, а author остаётся прежним.
- Текущая ветка двигается на новый коммит-SHA.
- HEAD автоматически следует за веткой.
Подробный разбор - в главе 4 учебника (plumbing).
Базовые формы
git commit # откроет редактор для сообщения
git commit -m "fix typo" # короткое inline-сообщение
git commit -m "title" -m "body" # title + пустая строка + body
git commit -a # auto-stage всех отслеживаемых
# файлов (как git add -u + commit)
git commit --amend # переписать последний коммит
--amend
Самый частый специальный режим. Не создаёт новый коммит, а переписывает HEAD-коммит. Используется, чтобы:
- добавить забытый файл (
git add forgot.js && git commit --amend) - исправить сообщение (
git commit --amend -m "новый текст") - оставить сообщение, но обновить содержимое (
git commit --amend --no-edit)
После --amend старая версия коммита остаётся в .git/objects/
как dangling - git reflog её увидит ещё месяц.
Важно: если коммит уже запушен - --amend создаст конфликт
при следующем push. Либо push --force-with-lease, либо новый
коммит вместо amend.
Сообщение коммита
Конвенция, родившаяся в Linux kernel и принятая большинством:
area: краткое описание в повелительном наклонении
Более подробный текст, если нужен. Что и почему,
не как - код сам про «как». Перенос по 72 символа.
Closes #123
Первая строка ≤ 50 символов, в повелительном (add, fix, не
added или adds). Пустая строка. Тело - если нужно объяснить
мотивацию или предупредить о тонкостях.
Подводные камни
git commitкоммитит индекс, а не рабочее дерево. Если забылgit add- изменения не попадут.git commit -am "..."(через-a) автостейджит только изменённые отслеживаемые файлы. Новые untracked-файлы не попадут. Их всегда надоgit addявно.- Пустой коммит не пройдёт без флага. Если нужно (например, для
тэгирования) -
git commit --allow-empty -m "release v1.0".