Commit standard
Conventional Commits
The most widely adopted git commit message standard. Conventional Commits gives your history a machine-readable structure that enables automated changelogs, semantic versioning, and better code review tooling.
Try the AI generator
Paste your diff, get a perfect Conventional Commit in seconds.
The format
type(scope): description
[blank line]
Optional body explaining WHY
[blank line]
Optional footer: BREAKING CHANGE: ...
The type is required and describes the category of change. The scope is optional but recommended — it names the part of the codebase affected. The description is a concise summary in imperative mood, under 72 characters.
Commit types
featA new feature visible to usersfixA bug fix visible to usersdocsDocumentation changes onlystyleFormatting, whitespace — no logic changerefactorCode restructure with no feature/fixperfPerformance improvementtestAdding or fixing testschoreBuild tooling, deps, CI configReal examples
feat(auth): add OAuth2 login with Google
fix(api): handle null response in user.profile endpoint
docs(readme): update setup instructions for M1 Macs
perf(db): add index on users.email column
refactor(payments): extract Stripe client into service layer
feat!: replace REST API with GraphQL BREAKING CHANGE: all /api/v1 endpoints removed
Breaking changes
When your change breaks backward compatibility, you must signal it in two places: append ! after the type/scope, and add a BREAKING CHANGE: footer explaining what changed and what users need to do.
feat(auth)!: require email verification before first login BREAKING CHANGE: users who registered before 2024-01-01 will be prompted to verify their email on next login. Silent login no longer supported for unverified accounts.
Why adopt it?
- →Automated changelog generation — tools like release-please and semantic-release parse your commit types to build changelogs
- →Semantic versioning — feat bumps MINOR, fix bumps PATCH, BREAKING CHANGE bumps MAJOR. Automate your releases.
- →Better code review — reviewers immediately understand the intent of a commit from its type
- →Searchable history — `git log --grep='^feat'` instantly shows all features added