Conventional Commits
Format all commit messages according to the Conventional Commits specification. This enables automated changelog generation, semantic versioning, and better commit history.
Format Structure
<type>[optional scope]: <description> [optional body] [optional footer(s)]
Commit Types
Required Types
- •
feat:- A new feature (correlates with MINOR in Semantic Versioning) - •
fix:- A bug fix (correlates with PATCH in Semantic Versioning)
Common Additional Types
- •
docs:- Documentation only changes - •
style:- Code style changes (formatting, missing semicolons, etc.) - •
refactor:- Code refactoring without bug fixes or new features - •
perf:- Performance improvements - •
test:- Adding or updating tests - •
build:- Build system or external dependencies changes - •
ci:- CI/CD configuration changes - •
chore:- Other changes that don't modify src or test files - •
revert:- Reverts a previous commit
Scope
An optional scope provides additional contextual information about the section of the codebase:
feat(parser): add ability to parse arrays fix(auth): resolve token expiration issue docs(readme): update installation instructions
Description
- •Must immediately follow the colon and space after the type/scope
- •Use imperative mood ("add feature" not "added feature" or "adds feature")
- •Don't capitalize the first letter
- •No period at the end
- •Keep it concise (typically 50-72 characters)
Body
- •Optional longer description providing additional context
- •Must begin one blank line after the description
- •Can consist of multiple paragraphs
- •Explain the "what" and "why" of the change, not the "how"
Breaking Changes
Breaking changes can be indicated in two ways:
1. Using ! in the type/scope
feat!: send an email to the customer when a product is shipped feat(api)!: send an email to the customer when a product is shipped
2. Using BREAKING CHANGE footer
feat: allow provided config object to extend other configs BREAKING CHANGE: `extends` key in config file is now used for extending other config files
3. Both methods
chore!: drop support for Node 6 BREAKING CHANGE: use JavaScript features not available in Node 6.
Examples
Simple feature
feat: add user authentication
Feature with scope
feat(auth): add OAuth2 support
Bug fix with body
fix: prevent racing of requests Introduce a request id and a reference to latest request. Dismiss incoming responses other than from latest request. Remove timeouts which were used to mitigate the racing issue but are obsolete now.
Breaking change
feat!: migrate to new API client BREAKING CHANGE: The API client interface has changed. All methods now return Promises instead of using callbacks.
Documentation update
docs: correct spelling of CHANGELOG
Multi-paragraph body with footers
fix: prevent racing of requests Introduce a request id and a reference to latest request. Dismiss incoming responses other than from latest request. Remove timeouts which were used to mitigate the racing issue but are obsolete now. Reviewed-by: Z Refs: #123
Guidelines
- •Always use a type - Every commit must start with a type followed by a colon and space
- •Use imperative mood - Write as if completing the sentence "If applied, this commit will..."
- •Be specific - The description should clearly communicate what changed
- •Keep it focused - One logical change per commit
- •Use scopes when helpful - Scopes help categorize changes within a codebase
- •Document breaking changes - Always indicate breaking changes clearly
Semantic Versioning Correlation
- •
fix:→ PATCH version bump (1.0.0 → 1.0.1) - •
feat:→ MINOR version bump (1.0.0 → 1.1.0) - •BREAKING CHANGE → MAJOR version bump (1.0.0 → 2.0.0)
When to Use
Use this format for:
- •All git commits
- •Commit message generation
- •Pull request merge commits
- •When the user asks about commit messages or git commits
Common Mistakes to Avoid
❌ Added new feature (past tense, capitalized)
✅ feat: add new feature (imperative, lowercase)
❌ fix: bug (too vague)
✅ fix: resolve null pointer exception in user service
❌ feat: add feature (redundant)
✅ feat: add user profile page
❌ feat: Added OAuth support. (past tense, period)
✅ feat: add OAuth support