UfoStation

Conventional Commits

Изображение: 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:

Нашли ошибку или опечатку? Предложите исправление