Идея с Conventional Commits звучит здраво на собрании: единый формат, автоматический changelog, понятная история изменений. А потом полкоманды через неделю снова пишет fix bug и wip, потому что никто не проверяет, а привычка сильнее любого документа в вики.
Базовый формат, с которого всё начинаетсяcd ~/Документы/devtools-site
cat > src/content/guides/semantic-versioning-in-practice.md << ‘EOF’
title: “Semantic Versioning на практике: major, minor или всего лишь patch” description: “Практические правила semver: когда ломать совместимость, а когда это просто исправление бага.” category: “Git”
Semver звучит просто: major.minor.patch. Сложность начинается в момент решения — вот это изменение сигнатуры функции, это уже breaking change или ещё нет.
Три числа
- patch — исправление бага без нового поведения
- minor — новая функциональность, обратно совместимая
- major — изменение, ломающее обратную совместимость
Пограничные случаи
| Изменение | Классификация | Почему |
|---|---|---|
| Добавили необязательный параметр | minor | Старый вызов работает без изменений |
| Изменили тип возврата с number на string | major | Код, ожидающий number, сломается |
| Исправили баг в вычислении | patch, но осторожно | Кто-то мог полагаться на старое поведение |
| Удалили deprecated метод | major | Удаление публичного API — всегда breaking |
Пре-релизные версии
2.1.0-beta.1 2.1.0-rc.2
npm по умолчанию не ставит такие версии без явного тега — защита от случайного нестабильного релиза в проде.
Как не гадать при тегировании
Если среди коммитов с прошлого релиза есть хотя бы один breaking change — версия major, сколько бы мелких фиксов ни было рядом. Git Tag Version Bumper считает следующую версию по типу изменения автоматически.
Итоговый чеклист
Breaking change почти всегда major, даже если старый код формально не падает с ошибкой, а просто ведёт себя иначе.
Пре-релизные суффиксы защищают пользователей пакета от случайной установки нестабильной версии.
Перед тегом стоит свериться со списком коммитов, а не полагаться на память о том, что там было за последний месяц.