Conventional Commits
На днях переоткрыл для себя Conventional Commits, вернее то, что оно пришло из мира Angular. Что это? Это такое соглашение о том, как необходимо оформлять текст ваших комитов. Сразу же возникает вопрос зачем это необходимо, ведь и так нормально жили.
Что даёт conventional commits
Во-первых, conventional commits предоставляют общий язык для тех, кто будет читать, поддерживать или вносить доработки в проект. Как часто вам приходится читать содержание комитов, чтобы понять что он исправляет/правит/добавляет? А если проект очень большой? А как понять без чтения комита, есть ли в нем изменения ломающие совместимость с прошлой версией? На все эти вопросы может ответить соглашение.
Во-вторых, conventional commits предоставят некоторые возможности по автоматизации. Например, повышение версии проекта, запуск в рамках CI pipeline этапов сборки или публикации, автогенерация CHANGELOG.
Как выглядит commit message
Каждое сообщение состоит из заголовка, тела и подвала. Согласен, пока ничего необычного. Однако заголовок имеет специальный формат, который включает в себя тип (type), область действия (scope) и описание (subject). Подвал может включать себя ссылку на github issue, описание breaking changes.
Схематично сообщение выглядит так:
<type>[(optional <scope>)]: <description>
<blank line>
[optional <body>]
<blank line>
[optional <footer(s)>]
Больше деталей о вариациях type, scope, что писать в «подвале» и ответы на другие вопросы можно найти на Commit Message Guidelines.
Пример следования соглашению Conventional Commits на примере проекта Angular:
Как следить за порядком
Может получится так, что вы начали следовать соглашению, но потом расслабились и стали забивать на оформление, что со мной когда-то и произошло. Или, скажем, целая команда следует соглашению, но кто-то делает ошибки в оформлении и это ломает уже последующую настроенную автоматизацию. Как это контролировать и следить за порядком commit message?
Можно «развернуть» такой комит с помощью commitlint и husky (инструкция).
Пример использования commitlint:
Нашли ошибку или опечатку? Предложите исправление