Git Conventional Commits

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.

  • Automatically generating CHANGELOGs.
  • Automatically determining a semantic version bump (based on the types of commits landed).
  • Communicating the nature of changes to teammates, the public, and other stakeholders.
  • Triggering build and publish processes.
  • Making it easier for people to contribute to your projects, by allowing them to explore a more structured commit history.

Specification

Conventional Commits[1] specifies the structure of the commit message:

1
2
3
4
5
<type>[optional scope]: <description>

[optional body]

[optional footer(s)]

Type

The type must use lowercase, cannot empty, followed by the OPTIONAL scope, OPTIONAL !, and REQUIRED terminal colon and space.

There are all available commit types:

  • build
  • chore
  • ci
  • docs
  • feat
  • fix
  • perf
  • refactor
  • revert
  • style
  • test

Scope

A scope MAY be provided after a type. A scope MUST consist of a noun describing a section of the codebase surrounded by parenthesis.

Description

The description is a short summary of the code changes, cannot be empty, and does not end with a period.

Body

A longer commit body MAY be provided after the short description, providing additional contextual information about the code changes. The body MUST begin one blank line after the description.

A commit body is free-form and MAY consist of any number of newline separated paragraphs.

One or more footers MAY be provided one blank line after the body. Each footer MUST consist of a word token, followed by either a :<space> or <space># separator, followed by a string value.

A footer’s token MUST use - in place of whitespace characters, a only exception is made for BREAKING CHANGE.

A footer’s value MAY contain spaces and newlines.

Correlate with SemVer

Some commit types may affect SemVer changes:

  1. fix means patches a bug, this correlates with PATCH in Semantic Versioning.
  2. feat means introduces a new feature, this correlates with MINOR in Semantic Versioning.
  3. BREAKING CHANGE is in the footer, or appends a ! after the type/scope, this correlates with MAJOR in Semantic Versioning.

Tools

Gitmoji

Gitmoji[2] is an initiative to standardize and explain the use of emojis on GitHub commit messages.

VS Code Extension

When committing in the VS Code, Conventional Commits[3] extension can help to generate a commit message.

The interface of Conventional Commits

GitHub Action

Release Please Action[4] is a GitHub Action, which can auto-generate and create releases based on commit messages.

Release Please Action will automatically create release pr includes generated CHANGELOG. When PR is merged, it will create a release, and you can run CI/CD and upload files to the release.

The PR created by Release Please Action

References

  1. "Conventional Commits". Retrieved June 28, 2022. ↩
  2. "gitmoji". Archived from the original on June 28, 2022. Retrieved June 28, 2022. ↩
  3. "Semantic Versioning". Archived from the original on June 28, 2022. Retrieved June 28, 2022. ↩
  4. "Release Please Action". Archived from the original on June 28, 2022. Retrieved June 28, 2022. ↩

Git Conventional Commits
https://blog.zhanganzhi.com/en/2022/06/ca740262a99f/
Author
Andy Zhang
Posted on
June 28, 2022
Licensed under