Как правильно писать Conventional Commits и зачем они нужны

Conventional Commits — это простой и понятный формат сообщений коммитов в Git.
Он помогает всем участникам проекта быстро понимать, что именно было сделано и зачем.


Зачем вообще нужны правила для коммитов

Сообщение коммита — это не формальность. Это короткое описание изменения в коде.

Хорошие коммиты помогают:

  • понимать историю проекта
  • быстрее находить нужные изменения
  • упрощать code review
  • автоматически собирать changelog
  • корректно повышать версию проекта

Плохие коммиты выглядят так:

fix
update
changes
temp

Через месяц никто (включая автора) не вспомнит, что там происходило.


Что такое Conventional Commits простыми словами

Conventional Commits — это договорённость писать коммиты по одному шаблону:

type(scope): short description

Пример:

fix(login): validate password length

Даже без просмотра кода понятно:

  • это фикс
  • он относится к логину
  • речь про валидацию пароля

Базовая структура коммита

type(scope): description

1. type — тип изменения

Тип показывает что за изменение вы сделали.

Самые распространённые:

TypeКогда использовать
featДобавили новую функциональность
fixИсправили баг
choreТехнические правки, конфиги, сборка
refactorПереписали код без изменения поведения
styleФорматирование, отступы, eslint
docsДокументация
testТесты
perfУлучшение производительности

Примеры:

feat: add export button
fix: prevent crash on load
chore: update dependencies

2. scope — область изменения (необязательно, но полезно)

Scope показывает, где именно произошло изменение:

  • компонент
  • страница
  • модуль
  • функциональный блок

Примеры:

feat(profile): add avatar upload
fix(api): handle 401 error
refactor(player): simplify init logic

Если scope не нужен, его можно не указывать:

fix: correct typo in text

3. description — коротко и по делу

Описание должно быть:

  • на английском
  • в настоящем времени
  • без точки в конце
  • с маленькой буквы
  • отвечать на вопрос: что сделано?

Хорошо:

fix(login): validate empty password

Плохо:

fix(login): fixed bug
fix(login): I fixed validation
fix(login): very important fix

Примеры хороших Conventional Commit’ов

Новая функциональность

feat(camera): add manual RTSP input

Исправление бага

fix(form): normalize phone number input

Технические изменения

chore(build): update vite to v5

Рефакторинг

refactor(auth): simplify authorization flow

Документация

docs(readme): add project setup section

Частая ошибка

❌ Один коммит — всё подряд:

feat: add form, fix bug, update styles

✅ Правильно — разделять:

feat(form): add registration form
fix(form): fix submit validation
style(form): align inputs spacing

Маленькие коммиты — это нормально и правильно.


Breaking changes (когда ломаешь совместимость)

Если изменение ломает старое поведение, это обязательно нужно указать.

Через !

feat(api)!: change auth response format

Или через описание ниже

feat(api): change auth response format

BREAKING CHANGE: token field renamed to accessToken

Это особенно важно для API и библиотек.


Почему коммиты принято писать на английском

  • английский — стандарт для международных команд
  • легче читать сторонним разработчикам
  • инструменты (changelog, release notes) ожидают английский
  • сообщения выглядят одинаково во всех проектах

Даже если команда русскоязычная — коммиты почти всегда на английском.


Краткая шпаргалка

feat(scope): add new feature
fix(scope): fix bug
chore(scope): technical changes
refactor(scope): code cleanup without behavior change
docs(scope): documentation
style(scope): formatting only
test(scope): add or update tests

Итог

Conventional Commits — это не бюрократия и не «для умных».

Это простой и рабочий способ:

  • писать понятные коммиты
  • поддерживать порядок в проекте
  • экономить время себе и другим

Если начать писать так сейчас, через пару недель это станет автоматическим навыком.