Как правильно писать 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 — это не бюрократия и не «для умных».

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

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

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