Git Commit Message Generator
Developer UtilitiesCreate conventional commit messages — feat, fix, docs, with scope and breaking changes. Free, private — all processing in your browser.
The Git Commit Message Generator helps you write clear, consistent commit messages following the Conventional Commits specification — the industry-standard format adopted by Angular, React, Vue, Next.js, and thousands of other projects. Choose a type (feat, fix, docs, chore, refactor, perf, test, build, ci, style, revert), optionally specify a scope (api, ui, db), write the subject in imperative mood, and the tool generates a properly-formatted commit message. Supports multi-line commits with body and footer (for breaking changes, issue references, co-authors).
Conventional Commits power automation — tools like semantic-release, standard-version, and commitlint read commit messages to automatically determine version bumps (fix = patch, feat = minor, BREAKING CHANGE = major), generate CHANGELOG.md files, and enforce commit message rules in CI. Teams using Conventional Commits have cleaner history, auto-generated release notes, and automatic version numbers. This tool bakes in all the rules so you never get "commit rejected by commitlint" errors.
Git Commit Message Generator — key features
All conventional types
feat, fix, docs, chore, refactor, perf, test, build, ci, style, revert. With explanations of each.
Scope input
Optional scope field. Common scopes suggested based on type.
Breaking change toggle
Mark as breaking with ! or full BREAKING CHANGE footer. Automatic major version trigger.
Body and footer
Multi-line commits with body (why + details) and footers (issue refs, co-authors, signed-off).
Subject validation
Character count, imperative mood hints, period removal. Matches commitlint rules.
Common patterns
One-click templates for common commits: new feature with tests, bug fix with issue reference, docs update, dependency bump.
Semantic release preview
Shows what version bump this commit would trigger with semantic-release (patch, minor, major, none).
Copy ready-to-use
Copy the full multi-line commit message. Paste into `git commit -m` (or use git commit alone and paste in editor).
How to use the Git Commit Message Generator
- 1
Pick the type
feat for new feature, fix for bug, docs for documentation, chore for maintenance, etc. Type drives version bumping.
- 2
Add scope (optional)
Which part of codebase this affects: api, ui, auth, database. Makes commit history more scannable.
- 3
Write the subject
Imperative mood (add, fix, update) — not past tense. Under 72 chars. No period. Describes WHAT you did.
- 4
Mark breaking if needed
If this change breaks consumers, toggle breaking change. Either ! or BREAKING CHANGE footer.
- 5
Add body (optional)
For complex changes: why you made it, what is different. Wrap at 72 chars.
- 6
Add issue reference
Closes #123 or Fixes #123 in footer automatically links and closes the issue on merge.
- 7
Copy and commit
Copy output. Paste into git commit -m or open your editor with git commit (no -m) and paste there.
Common use cases for the Git Commit Message Generator
Individual developers
- →Learn conventional commits: First time joining a team using the convention. Tool teaches the rules by letting you experiment.
- →Consistent commit quality: Even solo developers benefit from consistent commit messages. Future you will thank present you.
- →Automate changelog generation: Conventional commits + standard-version = automatic CHANGELOG.md from your commit history.
- →Auto-bump version: semantic-release reads your commits and bumps version automatically. Never manually update package.json version.
Team workflows
- →Team standard enforcement: Team agrees on Conventional Commits. This tool helps everyone write compliant messages.
- →CI commit validation: commitlint in CI rejects PRs with bad commit messages. Tool ensures your commits pass.
- →Squash merge with conventional message: Write PR description as conventional commit. Squash merge produces one clean commit.
- →Code review readability: Reviewers scan commit list to understand PR scope. Conventional types at a glance.
Open source
- →Contribution standards: Open source projects often require Conventional Commits. Tool ensures your PR passes commit message review.
- →Release automation: Projects using semantic-release rely on commits being perfectly formatted. Tool ensures yours are.
- →Automated changelogs: Users of your project get automatic release notes generated from commit messages.
- →SemVer compliance: Automatic version bumps based on commit types. Predictable release schedule.
CI/CD integration
- →semantic-release setup: Commit messages determine version. Tool generates compliant messages.
- →commitlint pre-commit hook: Hook validates commit messages before allowing commit. Tool generates messages that pass.
- →PR commit quality gate: CI rejects PRs with non-conventional commits. Tool is your safety net.
- →Auto-release on tag: Tag based on commits → triggers release workflow. Clean history makes releases predictable.
Git Commit Message Generator — examples
Feature commit
Adding a new capability.
Type: feat, scope: auth, subject: add OAuth 2.0 provider support
feat(auth): add OAuth 2.0 provider support → semantic-release: minor version bump (1.2.0 → 1.3.0)
Bug fix with issue
Fixing a reported bug.
Type: fix, scope: parser, subject: handle empty JSON arrays, closes #123
fix(parser): handle empty JSON arrays correctly Closes #123 → semantic-release: patch version bump (1.2.0 → 1.2.1)
Breaking change
API-breaking feature.
Type: feat with !, BREAKING CHANGE footer
feat(api)!: migrate from JSON to MessagePack All API endpoints now respond with MessagePack. Clients must accept application/x-msgpack. BREAKING CHANGE: JSON responses no longer available. Migrate to MessagePack parser. → semantic-release: major version bump (1.2.0 → 2.0.0)
Docs-only
Documentation update.
Type: docs, subject: update installation guide
docs: update installation guide for Node 20+ → No version bump
Dependency bump
Common chore commit.
Type: chore, scope: deps, subject: bump lodash
chore(deps): bump lodash from 4.17.20 to 4.17.21 → No version bump (unless security fix, then use fix)
Co-authored commit
Pair programming.
Added co-author
feat(ui): add dark mode toggle Co-authored-by: Jane Doe <jane@example.com>
Revert commit
Undoing a previous change.
Type: revert, referenced commit
revert: feat(auth): add OAuth 2.0 provider support This reverts commit abc1234. Reason: incompatibility with existing SSO.
Technical details
Conventional Commits (specified at https://www.conventionalcommits.org) is a lightweight convention for commit messages.
Format:
```
<type>[optional scope][!]: <description>
[optional body]
[optional footer(s)]
```
Example:
```
feat(api): add user search endpoint
Implements full-text search across users by name and email.
Uses PostgreSQL trigram indexes for performance.
Closes #123
```
Type (required):
Primary types with their semantic meaning:
- feat: — new feature (minor version bump)
- fix: — bug fix (patch version bump)
- docs: — documentation only changes
- chore: — maintenance, dependencies, build changes (no version bump)
- refactor: — code changes that neither fix bugs nor add features
- perf: — performance improvements (patch or minor)
- test: — adding or correcting tests
- build: — build system or dependency changes (npm, Maven, webpack)
- ci: — CI/CD configuration (GitHub Actions, Jenkins, Circle)
- style: — code formatting, whitespace, semicolons (no logic changes)
- revert: — revert a previous commit
Scope (optional):
In parentheses after type. Names a part of the codebase: feat(auth):, fix(api):, docs(readme):. Common scopes: component name, module name, affected package.
Breaking changes:
Indicate with ! after type/scope: feat!: or feat(api)!:. Or explicitly in footer: BREAKING CHANGE: description. Breaking changes trigger major version bump.
Subject (required):
The first line. Rules:
- Imperative mood — "add feature" not "added" or "adds". Matches git default (Merge branch...).
- No period at end.
- Lowercase first word (sometimes — some styles use capital).
- Under 50-72 characters (50 for strict projects, 72 for most).
- Describes what, not how.
Body (optional):
After blank line. Explains why and what more thoroughly. Wrap at 72 characters.
Footer (optional):
References issues, breaking changes, co-authors:
````
Closes #123
BREAKING CHANGE: API endpoint moved from /v1/user to /v2/user
Co-authored-by: Jane Doe <jane@example.com>
Signed-off-by: Alice <alice@example.com>
Automation integrations:
- semantic-release: reads commits to determine version bump + generate changelog + publish.
- standard-version: similar to semantic-release but local (no npm publish).
- commitlint: enforces commit message rules in git hooks and CI.
- commitizen: interactive prompt for commit message fields.
- GitHub: shows BREAKING CHANGE footer in release notes.
Version bumping logic (SemVer):
- feat → minor (1.2.0 → 1.3.0)
- fix → patch (1.2.0 → 1.2.1)
- perf → patch
- BREAKING CHANGE or ! → major (1.2.0 → 2.0.0)
- Other types → no version bump
Good vs bad examples:
BAD:
````
updated things
fix stuff
WIP
final v3 (for real)
Merge branch feat-new-thing into main
GOOD:
````
feat(auth): add OAuth 2.0 provider support
fix(parser): handle empty JSON arrays correctly
docs: update README with installation steps
chore(deps): bump lodash from 4.17.20 to 4.17.21
Common problems and solutions
⚠Using past tense
Conventional commits use **imperative mood**: add, fix, update — NOT added, fixed, updated. Matches git default messages (Merge branch X into Y). Imperative is shorter and consistent.
⚠Vague subjects
update stuff is useless. Be specific: update user authentication to use JWT. Future you grep-ing your history will thank you.
⚠Wrong type choice
feat vs fix is the most common mistake. feat is NEW functionality users can see. fix is broken functionality restored. refactor is internal improvement with no functional change.
⚠Missing breaking change marker
Removing an API endpoint without BREAKING CHANGE footer means consumers have no warning. Always mark breaking changes. Semantic-release depends on it for major version bumps.
⚠Too long subject line
Most tools truncate subjects at 72 chars. Keep under 50 for safety. If you need more, use body.
⚠Period at end of subject
Conventional style: no period. Subject is a command, not a sentence. Small visual inconsistency that commitlint catches.
⚠Mixing multiple types in one commit
One commit = one type. If your change is both feat and fix, split into two commits. Easier review, cleaner changelog.
⚠Using chore for everything
chore is maintenance that does not warrant version bump. But fix changes to code should be fix, not chore. Be precise with types.
Git Commit Message Generator — comparisons and alternatives
Conventional Commits vs Angular style: Angular pioneered this style. Conventional Commits is the broader specification that includes Angular style. Same format with small differences. Most projects use Conventional Commits; some stick with original Angular.
Conventional Commits vs Gitmoji: Gitmoji uses emoji prefixes (🚀 for deploy, 🐛 for bug). Visual but less tool-friendly. Conventional Commits is text-based, better for automation. Some projects use both.
Conventional Commits vs free-form: Free-form works but requires discipline to be consistent. Conventional Commits is consistent by default (the format enforces it). Automation (semantic-release) requires conventional.
Subject line length conventions: 50 chars (strict, kernel-style), 72 chars (common limit matching terminal width). 100+ chars is too long — most tools truncate.
Commit format vs PR title format: Commits are individual. PRs aggregate commits. Convention: same conventional format for both. Squash merge = PR title becomes the commit message. Keep PR titles conventional too.
BREAKING CHANGE in body vs footer: Can appear in either. Footer is more standard. Some tools (semantic-release) look for footer specifically.
Frequently asked questions about the Git Commit Message Generator
▶What are Conventional Commits?
Conventional Commits is a specification for commit message format — type(scope): subject. Widely adopted by open source projects (Angular, React, Vue, Next.js). Enables automation: semantic-release auto-bumps version, generates changelog. Improves commit history readability.
▶What are the main commit types?
feat (new feature, minor bump), fix (bug fix, patch bump), docs (documentation only), chore (maintenance, no version change), refactor (code change without behavior change), perf (performance improvement), test (test changes), build/ci (build system or CI changes), style (formatting only).
▶How do I indicate a breaking change?
Two ways: (1) Add ! after type/scope: feat(api)!: or feat!:. (2) Include BREAKING CHANGE: description in the footer. Both trigger major version bump with semantic-release. Use either or both.
▶What is the scope for?
Scope is optional, indicates which part of the codebase changed: feat(auth):, fix(api):, docs(readme):. Makes commit history more scannable (you can filter by area). Common scopes: component names, package names in monorepo, subsystems.
▶Why use imperative mood?
Consistency with git default. When git auto-generates messages (Merge branch X into Y), it uses imperative. Writing commits as if completing the sentence If applied, this commit will... helps ensure imperative tone. add feature makes sense; added feature does not.
▶What is semantic-release?
semantic-release is a tool that automates version management and package publishing. Reads your Conventional Commits, determines next version (patch/minor/major), generates changelog, creates git tag, publishes to npm/GitHub. Eliminates manual release process.
▶Should every commit be perfect?
Squash merges allow imperfection. During a feature branch, commits can be messy (checkpoint, WIP, fix typo). At merge time, squash into one well-formed conventional commit. Branch history can be imperfect; main history should be clean.
▶What is commitlint?
commitlint is a tool that validates commit messages against rules. Typically run as a git hook or CI check. Rejects commits that do not follow your convention. Ensures team compliance.
▶How long should commit messages be?
Subject: under 72 characters (50 for strict). One line. Body (optional): multiple paragraphs. Wrap lines at 72 chars. Explain WHY and WHAT (not HOW — the code shows how). Footer: issue refs, breaking changes, co-authors.
▶Can I reference issues or PRs?
Yes, in the footer: Closes #123, Fixes #456, Refs #789. GitHub automatically links and closes issues when commits with Closes/Fixes land on main. Refs is just a reference without closing.
Additional resources
- Conventional Commits Specification — Official Conventional Commits specification.
- semantic-release — Automated version management tool.
- commitlint — Commit message linter.
- commitizen — Interactive commit message prompter.
- Git Commands Cheat Sheet (Tooleras blog) — Our Git reference.
Related tools
All Developer UtilitiesCase Converter
Convert between upper, lower, title, camel, snake, kebab, Pascal, CONSTANT cases
Chmod Calculator
Calculate Unix file permissions — convert between symbolic and octal notation
Docker Compose Generator
Generate docker-compose.yml for multi-container apps — databases, caches, services
Dockerfile Generator
Generate production Dockerfiles for any stack — multi-stage, optimized, secure
.gitignore Generator
Create .gitignore files for 100+ languages, OS, IDEs — combinable templates
HTML Formatter
Format, indent, and beautify HTML, XHTML, and HTML5 markup
Learn more
Explore more tools
200+ free tools that run in your browser.
Browse all tools →