Commit Message → SemVer Mapping
Per the Conventional Commits v1.0.0 spec, only feat and fix are mandated. All other types are convention (from the Angular convention) and have no implicit SemVer effect unless they carry a breaking change.
| Commit Message |
SemVer Bump |
Example |
fix: … |
PATCH |
1.2.3 → 1.2.4 |
feat: … |
MINOR |
1.2.3 → 1.3.0 |
type!: … or type(scope)!: … |
MAJOR |
1.2.3 → 2.0.0 |
Any type + BREAKING CHANGE: footer |
MAJOR |
1.2.3 → 2.0.0 |
docs:, style:, chore:, ci:, build:, test:, refactor: |
None |
— |
perf: … |
Tool-dependent (semantic-release: PATCH) |
1.2.3 → 1.2.4 |
Worked examples
# PATCH
fix(api): handle null response body in /users endpoint
# MINOR
feat(queue): retry failed publishes with exponential backoff
# MAJOR (exclamation mark form)
feat(api)!: require Authorization header on all /v1 routes
# MAJOR (footer form — works with ANY type)
refactor(config): read settings from a single file
BREAKING CHANGE: CONFIG_DIR is no longer read. Set CONFIG_FILE instead.
Key nuance
The spec's own FAQ is explicit:
fix type commits should be translated to PATCH releases. feat type commits should be translated to MINOR releases. Commits with BREAKING CHANGE in the commits, regardless of type, should be translated to MAJOR releases.
A breaking change is not a type — it's a modifier (! or footer) that can attach to any type, including chore:, refactor:, etc. Tools like semantic-release and Release Please implement this mapping out of the box.
in addition to that we can also check the merged PRs for tags that say are breaking
Commit Message → SemVer Mapping
Per the Conventional Commits v1.0.0 spec, only
featandfixare mandated. All other types are convention (from the Angular convention) and have no implicit SemVer effect unless they carry a breaking change.fix: …1.2.3→1.2.4feat: …1.2.3→1.3.0type!: …ortype(scope)!: …1.2.3→2.0.0BREAKING CHANGE:footer1.2.3→2.0.0docs:,style:,chore:,ci:,build:,test:,refactor:perf: …1.2.3→1.2.4Worked examples
Key nuance
The spec's own FAQ is explicit:
A breaking change is not a type — it's a modifier (
!or footer) that can attach to any type, includingchore:,refactor:, etc. Tools like semantic-release and Release Please implement this mapping out of the box.in addition to that we can also check the merged PRs for tags that say are breaking