git commit и хорошие сообщения коммитов

Сохраняем изменения навсегда и учимся писать сообщения, за которые скажут спасибо.

Коммит — это снимок проекта в определённый момент с сообщением, описывающим, что и зачем изменилось.

Базовый коммит

Когда нужные изменения собраны в индексе, фиксируем их:

git commit -m "Добавить форму входа"

Вывод:

[main a1b2c3d] Добавить форму входа
 2 files changed, 18 insertions(+), 1 deletion(-)

Строка a1b2c3d — это сокращённый хеш коммита, его уникальный идентификатор. По нему вы сможете найти коммит в истории.

Полезные флаги

  • git commit -am "..." — добавить в индекс уже отслеживаемые изменённые файлы и сразу закоммитить (новые файлы так не добавятся).
  • git commit без -m — откроет редактор для развёрнутого сообщения.
  • git commit --amend — изменить последний коммит (поправить сообщение или дозабросить файл). Не делайте этого с уже опубликованными коммитами.

Что делает сообщение хорошим

Сообщение коммита — это письмо вашему будущему «я» и коллегам. Через полгода именно по нему вы поймёте, зачем была сделана правка. Сложилась удобная конвенция:

  • Первая строка — краткое резюме до ~50 символов, в повелительном наклонении: «Добавить...», «Исправить...», «Удалить...».
  • Пустая строка, затем при необходимости подробное описание: что и главное почему.
  • Объясняйте причину, а не пересказывайте диф. «Что» видно из кода, а «почему» — нет.

Плохо и хорошо

ПлохоХорошо
fixИсправить падение при пустом email
измененияДобавить валидацию формы регистрации
asdfОбновить зависимость requests до 2.32

Атомарные коммиты

Старайтесь, чтобы один коммит решал одну задачу. Не сваливайте в один коммит исправление бага, новую фичу и переименование переменных. Атомарные коммиты легче читать, ревьюить и при необходимости откатывать по одному.

Развёрнутое сообщение

Если правка нетривиальна, напишите тело коммита (откроется в редакторе при git commit без -m):

Исправить утечку памяти в обработчике загрузки

Файловые дескрипторы не закрывались при ошибке чтения,
из-за чего на больших файлах процесс падал. Добавлен
блок with, гарантирующий закрытие.

Коммит — это точка возврата

Думайте о каждом коммите как о точке сохранения в игре. Пока изменения не закоммичены, они «висят в воздухе»: их легко случайно потерять. Закоммитив, вы получаете надёжную точку, к которой всегда можно вернуться. Поэтому коммитьте часто — как только сделали законченный осмысленный шаг. Маленькие частые коммиты гораздо удобнее одного гигантского в конце дня: их проще читать, откатывать и переносить.

Conventional Commits

Во многих командах принята договорённость о префиксах в сообщениях, которая называется Conventional Commits. Префикс показывает тип изменения:

  • feat: — новая функциональность;
  • fix: — исправление бага;
  • docs: — изменения в документации;
  • refactor: — переработка кода без смены поведения.

Например: feat: добавить вход через Google. Такой формат позволяет автоматически строить списки изменений к релизам — но даже без него главное правило прежнее: пишите понятно.

Итог

  • Коммит фиксирует содержимое индекса и получает уникальный хеш.
  • Первая строка — краткое резюме в повелительном наклонении до ~50 символов.
  • Объясняйте «почему», делайте атомарные коммиты по одной задаче.
Проверьте себя
1. Что фиксирует команда git commit?
AВсе файлы рабочей директории целиком
BТолько содержимое индекса (staged-изменения)
CИзменения на удалённом сервере
DИсторию команд терминала
2. Какое сообщение коммита считается хорошим?
Afix
Basdf
CИсправить падение при пустом email
Dизменения от 14 июня
3. Что делает флаг -a в команде git commit -am "..."?
AДобавляет в индекс уже отслеживаемые изменённые файлы перед коммитом
BДобавляет абсолютно все файлы, включая новые
CОтменяет последний коммит
DОтправляет коммит на сервер
Поддержать проект