Программирование и IT
git commit
Коммит — это сохранённое состояние проекта с автором, временем и сообщением. Команда git commit берёт то, что ты заранее отобрал командой git add, и записывает это в историю одной неделимой порцией.
В этой статье
В коммит попадает индекс, а не папка#
Между твоими файлами и историей есть промежуточный слой — индекс, он же
staging area. Команда git add копирует туда текущее содержимое файла, а
git commit записывает в историю ровно то, что лежит в индексе на момент
запуска. Отсюда неожиданность новичка: если после git add файл поправили
ещё раз, в коммит уйдёт прежняя версия, а новая останется в рабочем
каталоге. git status показывает оба списка отдельно — «Changes to be
committed» и «Changes not staged for commit».
Поэтому порядок такой: посмотреть git status, отобрать нужное git add,
свериться с git diff --staged и только потом коммитить.
Синтаксис#
| Ключ | Что делает |
|---|---|
-m "текст" |
сообщение прямо в команде, без запуска редактора |
-a |
взять все изменения уже отслеживаемых файлов, минуя git add |
--amend |
заменить последний коммит новым вместо создания ещё одного |
--no-edit |
при --amend оставить прежнее сообщение |
--allow-empty |
сделать коммит без изменений (бывает нужно для проверок) |
-v |
показать в редакторе сам diff — удобно перечитать перед записью |
Ключ -a не подбирает новые файлы: то, о чём git ещё не знает, придётся
добавить руками. Сообщение пишут в повелительном наклонении и по делу —
первая строка до примерно 50 знаков, подробности через пустую строку.
Пример: первый коммит в новом репозитории#
[main (root-commit) 4f1c2ab] Описание проекта
1 file changed, 12 insertions(+)
create mode 100644 README.md
В скобках — ветка и сокращённый хеш. У самого первого коммита рядом стоит
пометка root-commit: у него нет родителя.
Пример: поправить только что сделанный коммит#
Забыли файл или опечатались в сообщении — не нужен ещё один коммит
«исправление опечатки»:
[main 9d31c07] Первая версия разбора аргументов
Date: Sat Sep 20 11:04:18 2026 +0300
2 files changed, 41 insertions(+)
Хеш изменился — это другой коммит, старый просто перестал быть нужен.
Отсюда правило: --amend безопасен, пока коммит не уехал на сервер. Что
делать, если уже уехал, разобрано в статье про
git push.
На что жалуется git#
nothing to commit, working tree clean — в индексе пусто и менять нечего.
Обычно забыт git add.
Untracked files:
(use "git add <file>..." to include in what will be committed)
notes.txt
nothing added to commit but untracked files present
Файл новый, git за ним не следит. Либо добавь его, либо внеси шаблон в
файл .gitignore, если он попал в папку случайно.
Please tell me who you are — не заполнены имя и почта. Лечится один раз
на машину:
Aborting commit due to empty commit message — редактор закрыли, ничего не
написав. Git сознательно отказывается записывать коммит без сообщения.
Как отменить коммит#
Всё зависит от того, ушёл ли он на сервер.
Снимает последний коммит, но оставляет изменения в индексе — можно тут же
закоммитить заново. Вариант --mixed (он же по умолчанию) вернёт правки в
рабочий каталог, а --hard сотрёт их вместе с коммитом, и это единственный
по-настоящему опасный из трёх.
Создаёт новый коммит, отменяющий указанный. Историю не переписывает,
поэтому годится для того, что уже видели коллеги.
Если запутался и кажется, что работа потеряна, посмотри git reflog:
там перечислены все состояния HEAD за последние недели, и почти любой
«пропавший» коммит находится там по хешу.
План по этапам
- Посмотреть, что изменилосьgit status и git diff: сначала понять, из чего собирать коммит.
- Отобрать в индексgit add по файлам; проверить выбор командой git diff --staged.
- Записать с сообщениемgit commit -m с осмысленной первой строкой до 50 знаков.
- Свериться с историейgit log --oneline -3: коммит на месте, ветка сдвинулась.
- Поправить при необходимостиПока коммит не отправлен — git commit --amend; после отправки — git revert.
Начать изучать эту тему у себя
План ляжет в твой репозиторий: отмечай этапы, веди конспект — история изменений покажет, как ты продвинулся.
Проверь себя
1.Какая команда закоммитит изменения всех отслеживаемых файлов без отдельного git add?
2.Коммит сделан, но не отправлен; нужно убрать его, сохранив правки в файлах. Что выбрать?
3.Что делает git commit --amend?
Источники
-
Pro Git, книга на русскомРаздел «Запись изменений в репозиторий»бесплатно
-
Справка git commitВсе ключи и формат сообщениябесплатно
Было полезно?