Gernar
Frontend DeveloperGit, сборка и DevOps

Интервью-вопрос

Что такое Conventional Commits

Это соглашение о формате сообщений коммитов. С ним вам проще читать историю, а инструментам проще собирать changelog, release notes и версии.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 50 правильно

Как лучше объяснить Conventional Commits на интервью?

Вы хотите дать короткий ответ без ухода в детали Git-flow.

Варианты ответа

Разбор

Разобраться, а не зазубрить

Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.

Базовая идея

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

type(scope): short description

Пример для frontend-проекта:

feat(cart): add promo code field
fix(auth): keep user on login error
docs(readme): update local setup steps
ci(release): run commitlint in pipeline

Для интервью достаточно сказать, что это не отдельный инструмент и не замена Git. Это договоренность о формате. Потом ее могут использовать инструменты: commitlint, semantic-release, генераторы changelog и CI-пайплайны.

Что входит в формат

В первой строке обычно есть три части. type говорит, что произошло. scope уточняет область изменения и часто пишется в скобках. subject коротко описывает результат изменения.

На интервью можно сказать так:

Я смотрю на Conventional Commits как на маленький контракт между разработчиками и релизной автоматизацией. Если я пишу fix(search): keep filters after reload, команда сразу видит багфикс в поиске, а инструменты могут отнести изменение к patch-релизу.

Scope не обязан быть сложным. Во frontend это может быть компонент, фича, пакет, слой приложения или часть инфраструктуры: auth, checkout, ui-kit, storybook, release. Плохой scope вроде misc почти не помогает. Он только создает иллюзию порядка.

Как выбрать тип коммита

Как выбрать тип без угадывания

1Добавили пользовательскую возможность?
Используйте `feat`, даже если изменение небольшое.
2Исправили дефект без новой возможности?
Используйте `fix`, чтобы релизный инструмент мог поднять patch-версию.
3Изменили сборку, CI или зависимости?
Используйте `build`, `ci` или `chore`. Выбор зависит от договоренности команды.
4Поменяли публичный контракт?
Добавьте `!` или `BREAKING CHANGE:` и опишите миграцию. Проверьте API-ответы, props, события аналитики и конфиги, которые используют другие фронтенды.

Тип должен описывать смысл изменения, а не настроение автора. Если вы исправили баг, пишите fix, даже если пришлось сильно переписать код. Если добавили новую возможность для пользователя или потребителя пакета, пишите feat. Если поменяли только тесты, документацию, CI или сборку, выбирайте тип, который команда использует для таких задач.

Плохой пример:

update checkout

Здесь непонятно, это новая возможность, багфикс, рефакторинг или изменение сборки. Без нормального типа changelog может стать бесполезным. На ревью тоже сложнее понять риск изменения. Безопаснее написать, например, fix(checkout): keep payment error visible или feat(checkout): add saved card option, чтобы команда сразу видела влияние на UI.

Что важно для SemVer и релизов

Conventional Commits часто используют вместе с Semantic Versioning. Типичная логика такая: fix дает patch, feat дает minor, а breaking change дает major. Но важно сказать аккуратно. Точное поведение зависит от инструмента и конфигурации проекта.

Breaking change можно пометить так:

feat(api)!: remove legacy profile fields

BREAKING CHANGE: profile response no longer includes firstName and lastName.
Use fullName instead.

Для frontend-разработчика это важно не только в библиотеках. Если вы меняете контракт API, props публичного компонента, событие аналитики или формат конфигурации, потребители могут сломаться. Поэтому breaking change нужно явно показать в истории и release notes.

Практические примеры для frontend

Какие сообщения помогают команде

Новая фичаfeat(cart): add promo code field

Такой коммит показывает, что появилась новая возможность. Обычно он ведет к minor-версии.

Исправлениеfix(search): keep query after reload

Так проще отделить багфикс от рефакторинга и не потерять его в changelog.

Опасный контрактfeat(api)!: remove legacy profile fields

Это сигнал о major-риске. Без пояснения потребители API могут обновиться и получить пустые поля в UI или сломанный экран профиля. Безопаснее добавить footer с заменой полей.

CI и сборкаci(release): run commitlint in pipeline

UI не меняется напрямую, но релизный процесс становится надежнее. История тоже остается чище.

На практике Conventional Commits особенно полезны там, где много людей, пакетов и релизов. В монорепозитории scope помогает понять, какой пакет изменился. В UI-kit он помогает пользователям библиотеки увидеть, что поменялось в Button, Modal или Theme. В продуктовой команде типы помогают быстро отделить багфиксы от новых возможностей.

Но формат не заменяет качество самого коммита. Если один коммит одновременно меняет API, верстку, тесты, зависимости и конфигурацию CI, правильная первая строка не спасет ревью. Лучше разделить изменения или написать body, где объясняется причина и риск.

Как внедрять без боли

Ответ будет сильнее, если вы покажете, как это работает в команде. Обычно правила описывают в README или contribution guide, добавляют commitlint, а проверку запускают через Git-хук или CI. Тогда формат не зависит от того, помнит ли каждый разработчик все детали.

При этом не стоит звучать слишком жестко. Для черновых коммитов на личной ветке команда может разрешать свободный формат. При merge можно использовать squash с нормальным сообщением. Важен результат: основная история, по которой выпускаются релизы, должна быть понятной и пригодной для автоматической обработки.

Частые ошибки

Где обычно ошибаются

Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.

  1. 1

    Называть любой коммит update

    Такой тип почти ничего не говорит о характере изменения. В changelog он либо потеряется, либо попадет не в тот раздел. Лучше выбрать конкретный тип: feat, fix, docs, test, ci или другой тип из правил команды.
  2. 2

    Путать subject с подробным описанием

    Первая строка должна быть короткой и понятной. Не кладите в нее весь контекст задачи. Иначе историю будет трудно читать в git log. Подробности, ссылки на issue и инструкции по миграции лучше вынести в body или footer.
  3. 3

    Не помечать breaking change

    Если публичный контракт изменился, обычного feat недостаточно. Релизный инструмент может выпустить minor вместо major, а пользователи обновятся без подготовки. Во frontend это может дать пустое состояние вместо данных, сломанную форму или неверную аналитику. Укажите ! и добавьте BREAKING CHANGE: с конкретным последствием и безопасной заменой.
  4. 4

    Считать scope обязательным всегда

    Scope полезен, когда он уточняет модуль, пакет или компонент. Но пустой или случайный scope вроде misc только создает шум. Если область не ясна или изменение глобальное, лучше следовать правилам команды, чем придумывать фиктивную область.
  5. 5

    Оставлять правило без автоматической проверки

    Договоренность быстро ломается, когда в проекте много людей и срочные релизы. Без commitlint или CI-проверки в main попадут разные форматы, а генерация changelog станет ненадежной. Лучше проверять формат до merge или при создании коммита.

Follow-up

Что могут спросить дальше

Короткие ответы на вопросы, где проверяют понимание формата, релизов и командных правил.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.

Содержание