Интервью-вопрос
Что такое Conventional Commits
Это соглашение о формате сообщений коммитов. С ним вам проще читать историю, а инструментам проще собирать changelog, release notes и версии.
- Добавлен
- Редакция
Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.
Мини-квиз
Проверка перед разбором
Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.
Вопрос 1 из 50 правильно
Разбор
Разобраться, а не зазубрить
Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.
Базовая идея
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 почти не помогает. Он только создает иллюзию порядка.
Как выбрать тип коммита
Как выбрать тип без угадывания
Используйте `feat`, даже если изменение небольшое.Используйте `fix`, чтобы релизный инструмент мог поднять patch-версию.Используйте `build`, `ci` или `chore`. Выбор зависит от договоренности команды.Добавьте `!` или `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(release): run commitlint in pipelineUI не меняется напрямую, но релизный процесс становится надежнее. История тоже остается чище.
На практике Conventional Commits особенно полезны там, где много людей, пакетов и релизов. В монорепозитории scope помогает понять, какой пакет изменился. В UI-kit он помогает пользователям библиотеки увидеть, что поменялось в Button, Modal или Theme. В продуктовой команде типы помогают быстро отделить багфиксы от новых возможностей.
Но формат не заменяет качество самого коммита. Если один коммит одновременно меняет API, верстку, тесты, зависимости и конфигурацию CI, правильная первая строка не спасет ревью. Лучше разделить изменения или написать body, где объясняется причина и риск.
Как внедрять без боли
Ответ будет сильнее, если вы покажете, как это работает в команде. Обычно правила описывают в README или contribution guide, добавляют commitlint, а проверку запускают через Git-хук или CI. Тогда формат не зависит от того, помнит ли каждый разработчик все детали.
При этом не стоит звучать слишком жестко. Для черновых коммитов на личной ветке команда может разрешать свободный формат. При merge можно использовать squash с нормальным сообщением. Важен результат: основная история, по которой выпускаются релизы, должна быть понятной и пригодной для автоматической обработки.
Частые ошибки
Где обычно ошибаются
Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.
- 1
Называть любой коммит update
Такой тип почти ничего не говорит о характере изменения. В changelog он либо потеряется, либо попадет не в тот раздел. Лучше выбрать конкретный тип:feat,fix,docs,test,ciили другой тип из правил команды. - 2
Путать subject с подробным описанием
Первая строка должна быть короткой и понятной. Не кладите в нее весь контекст задачи. Иначе историю будет трудно читать вgit log. Подробности, ссылки на issue и инструкции по миграции лучше вынести в body или footer. - 3
Не помечать breaking change
Если публичный контракт изменился, обычногоfeatнедостаточно. Релизный инструмент может выпустить minor вместо major, а пользователи обновятся без подготовки. Во frontend это может дать пустое состояние вместо данных, сломанную форму или неверную аналитику. Укажите!и добавьтеBREAKING CHANGE:с конкретным последствием и безопасной заменой. - 4
Считать scope обязательным всегда
Scope полезен, когда он уточняет модуль, пакет или компонент. Но пустой или случайный scope вродеmiscтолько создает шум. Если область не ясна или изменение глобальное, лучше следовать правилам команды, чем придумывать фиктивную область. - 5
Оставлять правило без автоматической проверки
Договоренность быстро ломается, когда в проекте много людей и срочные релизы. Безcommitlintили CI-проверки в main попадут разные форматы, а генерация changelog станет ненадежной. Лучше проверять формат до merge или при создании коммита.
Follow-up
Что могут спросить дальше
Короткие ответы на вопросы, где проверяют понимание формата, релизов и командных правил.
Живые ответы
Видео с похожим вопросом
Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.
Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.
Что используешь для сборки проекта 😎
В ответе важно назвать конкретный стек сборки, объяснить выбор и показать, как вы проверяете production build. Разбираем Vite, Webpack, code splitting, оптимизацию и CI без лишнего списка инструментов.
В чем разница между git rebase и git merge
Разбор вопроса «В чем разница между git rebase и git merge» для Frontend Developer: что проверяет интервьюер, ключевые тезисы, практические примеры и частые ошибки.