Когда я только знакомился с системами контроля версий (особенно с git), я рассматривал их только как приложения, которые помогают мне хранить историю изменений моего кода. Т.е. когда случается что-то нехорошее, я могу просмотреть историю коммитов и вернуться к последнему «хорошему» состоянию кода в моем репозитории.
Но когда я начал более плотно использовать их в своей работе, я понял, что их функция шире, чем просто контроль версий, это также инструмент совместной работы, где вы описываете свою историю взаимодействия с репозиторием и делитесь ею с другими разработчиками. Именно тогда я узнал, что хорошие комментарии к коммитам (commit message) могут значительно улучшить ваше взаимодействие с другими членами команды (и не только).
В этой статье я расскажу о том, как хороший стиль написания комментариев к коммитам может помочь вам стать лучшим разработчиком, и как общепринятые коммиты (conventional commits - соглашение о семантике комментариев к коммитам, которое я использую и рекомендую вам) упростят и улучшат ваш процесс написания комментариев к коммитам.
Ранние годы
В ранние годы использования git я никогда особо не заморачивался о том, как писать комментарии к коммитам. Большая часть моих комментариев к коммитам выглядела следующим образом:
commit e71fcf2022b6135e18777bdc58c2ac3180202ec7
Author: mvalentino
Date: Tue Apr 24 01:25:48 2015 +1000
Извлечение информации для страницы оплаты
commit d1952883b05b685f2d22e4c41b4fbc4362fd6bd0
Author: mvalentino
Date: Mon Apr 23 22:16:50 2015 +1000
[WIP] Интеграция полосы
commit 74b8920d96e3e09d5cd958ffa369a0e3c86a6851
Author: mvalentino
Date: Mon Apr 23 21:09:11 2015 +1000
Генерация ссылки для платежа
commit b02255b25eed57c7595504c66233d5ee3024190c
Author: mvalentino
Date: Mon Apr 23 18:32:40 2015 +1000
[WIP] Автоматическое размещение виджета поиска
У меня не возникало даже мысли использовать тело коммита. Моей дежурной командой неизменно служила git commit -m <commit message>
. Когда вы работаете в компании, которая занимается пиаром, код ревью не является для вас привычной практикой. Никто даже не думал предложить мне обратить внимание на мои комментарии к коммитам. Ситуация изменилась, когда я перешел в компанию с хорошей инженерной культурой, где я научился написанию комментариев, четко объясняющих, что это за коммит, как неотъемлемой части моей работы.
Пытаясь найти лучший способ писать комментарии к коммитам, я наткнулся на эту статью от разработчика по имени Крис Бимс. В этой статье я впервые увидел термин «атомарный коммит». Из этой статьи я узнал 7 правил, которые помогут вам сделать ваши комментарии к git-коммитам лучше (рекомендую вам прочитать всю статью, чтобы лучше разобраться в деталях по каждому из правил):
Отделяйте заголовок от тела пустой строкой
Ограничивайте заголовок 50 символами
Пишите заголовок с заглавной буквы
Не ставьте точку в конце заголовка
Используйте повелительное наклонение в заголовке
Переходите на следующую строку в теле на 72 символах
В теле отвечайте на вопросы что и почему, а не как
Перенесемся на два месяца назад - я, насмотревшись комментариев к коммитам других разработчиков, чтобы использовать их в качестве примеров для структурирования моих собственных комментариев, продолжаю пытаться применять правила, указанные выше. Одна вещь, которая мешает мне написать хороший комментарий к коммиту, - это неспособность определить, какие изменения относятся к какому комментарию. Каждый раз, когда я хочу закоммитить свои изменения, у меня запускается мысленный процесс, пытающийся разделить изменения, чтобы их можно было сгруппировать как можно более «атомарно».
Общепринятые коммиты спешат на помощь
Так я мучался, пока мой коллега не показал мне это соглашение, называемое [conventional commits] (общепринятые коммиты - https://www.conventionalcommits.org/ru/v1.0.0-beta.2/), которое значительно облегчило написание четких и ясных комментариев к коммитам. Оно в первую очередь определяет набор структур, чтобы вы знали, какие изменения относятся к какому типу комментария.
В общепринятых коммитах есть 16 спецификаций, которые определяют, каким должен быть комментарий к коммиту. Я могу не помнить досконально всех спецификаций, но в целом я всегда стараюсь следовать основному соглашению, которое определяет структуру заголовка комментария к коммиту.
Вкратце, для каждого комментария к коммиту структура всегда следующая
<type>(<опциональная область>): <описание изменения>
<пустая строка>
[необязательное тело]
<пустая строка>
[необязательный нижний колонтитул]
Первая строка комментария к коммиту будет иметь вид:
feat: добавить колебание шапки
^ — ^ ^ — — — — — — ^
| |
| +-> Резюме в настоящем времени.
|
+ - - - -> Type: chore, docs, feat, fix, refactor, style или test.
где <type>
может быть одним из следующих:
feat:
(новая фича для пользователя, а не, например, новая функция для скрипта сборки)
fix:
(исправление ошибки для пользователей, а не исправление скрипта сборки)
docs:
(изменения в документации)
style:
(форматирование, отсутствующие точки с запятой и т. д .; без изменения производственного кода)
refactor:
(рефакторинг производственного кода, например, переименование переменной)
test:
(добавление недостающих тестов, рефакторинг тестов; без изменения производственного кода)
chore:
(обновление рутинных задач и т. д.; без изменения производственного кода).
Теперь я могу быстро определить, какие изменения я внес и как будет выглядеть комментарий к коммиту этих изменений. С этим форматом вы как разработчик можете сразу узнать (или хотя бы догадаться), что изменилось в конкретном коммите. Если возникла проблема с новым мержем с основной веткой, вы также можете быстро просмотреть историю git, чтобы выяснить, какие изменения могли вызвать проблему, без необходимости вникать в diff.
Как указано на сайте общепринятых коммитов, есть несколько веских причин использовать это соглашение.
Автоматическая генерация чейнджлогов.
Автоматическое определение семантического повышения версии (на основе типов совершенных коммитов).
Информирование товарищей по команде, сообщества и других заинтересованных сторон о характере изменений.
Запуск процессов сборки и публикации по триггерам.
Возможность упростить людям участие в ваших проектах, позволив им изучить более структурированную историю коммитов.
Как я использую это на практике
Для управления проектами в своей работе я использую Jira, и он также имеет интеграцию с Github. Недавно я узнал, что если вы укажете номер тикета Jira в комментарии к своему коммиту, Jira сможет автоматически обнаружить его и встроить непосредственно в карточку, над которой вы сейчас работаете в Jira. Это хорошо согласуется с соглашением, поскольку я могу указать номер тикета Jira как часть <optional scope>
в комментарии. Итак, теперь каждый раз, когда я работаю над задачей из Jira, мой комментарий к коммиту будет будет выглядеть
<type>(<номер тикета jira>): Название коммита
Пример из одного из комментариев к коммиту, который я недавно сделал
refactor(FOW-1327): рефакторинг класса аутентификации
добавить новое имя класса `userRepo` и извлечь вызов api в `/api/v1/users/me` из аутентификации в отдельный класс и использовать новый класс для хранения всех внешних вызовов api, связанных с данными пользователя
и в Jira это также будет отражено.
Другой пример с моей работы, который опирается на это соглашение, - это библиотека системы проектирования с открытым исходным кодом под названием Kaizen, где общепринятый формат коммитов (особенно fix
и feat
) используется для создания описаний в чейнджлогах релизов пакетов.
Заключение
После того, как все это время я стремился улучшить способ написания комментариев к git-коммитам, я могу с уверенностью утверждать, что использование общепринятых коммитов помогло мне стать лучшим разработчиком. Теперь, когда я смотрю историю своего git-репозитория, я могу быстро выяснить, что произошло в репозитории за последнее время, и догадаться о сути изменений, просто посмотрев на комментарий к коммиту.
Ссылки
Искусство коммита, Дэвид Демари
А прямо сейчас приглашаем ва ознакомиться с программой супер-интенсива "Версионирование и командная работа с помощью Git", а таже записаться на день открытых дверей.
geher
Для комментариев на русском языке (в приведенном примере комментарий именно на нем, родимом) смотрится крайне неестественно.
Повелительное наклонение все-таки предназначено для постановки задач, в то время как описание коммита про уже сделанное.
Логичнее бы смотрелось существительное, описывающее процесс, или прошедшее время.
MaxRokatansky Автор
Естественно в оригинале комментарии приведены на английском языке. Мы перевели их для того, чтобы было понятно о чем идет речь. Но, возможно Вы правы и имеет смысл оставить их без перевода.
Coriolis
Вот, согласен.
Usul
Лично для меня, повелительное наклонение в заголовке смотрится одинаково неестественно и на английском, и на русском. Но, похоже, это общепринятая практика. Предполагаю, что это делают для упрощения синхронизации с баг-трекером, JIRA и т.п. Появилась у вас задача «FOW-1327. Add error message when user has no access to review», вы ее выполнили, и имя задачи превратилось в имя коммита.
IkaR49
Нашей конторе это не поможет… Тестировщики то и дело присылают задачи с заголовком "Ошибка программы". И когда таких задач несколько к ряду — утомительно заглядывать в каждую и определять, в какой области, хотя бы, проблема.
Usul
Сочувствую. Разработчики тоже всякие бывают. У нас один особо одаренный вообще не заморачивался с наименованием коммитов, а тупо писал «Реализация». Буквально, одно слово, без пояснений. Смотришь ветку — а там 20 штук «реализаций» подряд :) И ведь не врет, там и правда фичи реализуются, все чОтко.
HighTechLowLife
Даже номер задачи, получается, не указывал?