The Conventional Commits specification is a lightweight convention on top of commit messages. It provides an easy set of rules for creating an explicit commit history; which makes it easier to write automated tools on top of. This convention dovetails with SemVer, by describing the features, fixes, and breaking changes made in commit messages.
The commit message should be structured as follows:
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
fix patches a bug in your codebase (this correlates with PATCH in Semantic Versioning).feat introduces a new feature to the codebase (this correlates with MINOR in Semantic Versioning).BREAKING CHANGE:, or appends a ! after the type/scope, introduces a breaking API change (correlating with MAJOR in Semantic Versioning).
A BREAKING CHANGE can be part of commits of any type.fix: and feat: are allowed, for example @commitlint/config-conventional (based on the Angular convention) recommends build:, chore:,
ci:, docs:, style:, refactor:, perf:, test:, and others.BREAKING CHANGE: <description> may be provided and follow a convention similar to
git trailer format.Additional types are not mandated by the Conventional Commits specification, and have no implicit effect in Semantic Versioning (unless they include a BREAKING CHANGE).
A scope may be provided to a commit's type, to provide additional contextual information and is contained within parenthesis, e.g., feat(parser): add ability to parse arrays.
feat: allow provided config object to extend other configs
BREAKING CHANGE: `extends` key in config file is now used for extending other config files
! to draw attention to breaking changefeat!: send an email to the customer when a product is shipped
! to draw attention to breaking changefeat(api)!: send an email to the customer when a product is shipped
! and BREAKING CHANGE footerchore!: drop support for Node 6
BREAKING CHANGE: use JavaScript features not available in Node 6.
docs: correct spelling of CHANGELOG
feat(lang): add Polish language
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
The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in RFC 2119.
feat, fix, etc., followed
by the OPTIONAL scope, OPTIONAL !, and REQUIRED terminal colon and space.feat MUST be used when a commit adds a new feature to your application or library.fix MUST be used when a commit represents a bug fix for your application.fix(parser)::<space> or <space># separator, followed by a string value (this is inspired by the
git trailer convention).- in place of whitespace characters, e.g., Acked-by (this helps differentiate
the footer section from a multi-paragraph body). An exception is made for BREAKING CHANGE, which MAY also be used as a token.! immediately before the :. If ! is used, BREAKING CHANGE: MAY be omitted from the footer section,
and the commit description SHALL be used to describe the breaking change.feat and fix MAY be used in your commit messages, e.g., docs: update ref docs.We recommend that you proceed as if you've already released the product. Typically somebody, even if it's your fellow software developers, is using your software. They'll want to know what's fixed, what breaks etc.
Any casing may be used, but it's best to be consistent.
Go back and make multiple commits whenever possible. Part of the benefit of Conventional Commits is its ability to drive us to make more organized commits and PRs.
It discourages moving fast in a disorganized way. It helps you be able to move fast long term across multiple projects with varied contributors.
Conventional Commits encourages us to make more of certain types of commits such as fixes. Other than that, the flexibility of Conventional Commits allows your team to come up with their own types and change those types over time.
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.
@jameswomack/conventional-commit-spec?We recommend using SemVer to release your own extensions to this specification (and encourage you to make these extensions!)
fix instead of featPrior to merging or releasing the mistake, we recommend using git rebase -i to edit the commit history. After release, the cleanup will be different according to what tools and processes you use.
feet instead of featIn a worst case scenario, it's not the end of the world if a commit lands that does not meet the Conventional Commits specification. It simply means that commit will be missed by tools that are based on the spec.
No! If you use a squash based workflow on Git lead maintainers can clean up the commit messages as they're merged—adding no workload to casual committers. A common workflow for this is to have your git system automatically squash commits from a pull request and present a form for the lead maintainer to enter the proper git commit message for the merge.
Reverting code can be complicated: are you reverting multiple commits? if you revert a feature, should the next release instead be a patch?
Conventional Commits does not make an explicit effort to define revert behavior. Instead we leave it to tooling authors to use the flexibility of types and footers to develop their logic for handling reverts.
One recommendation is to use the revert type, and a footer that references the commit SHAs that are being reverted:
revert: let us never again speak of the noodle incident
Refs: 676104e, a215868