Git コミット・メッセージの規約 Conventional Commits チートシート


Conventional Commits とは

Conventional Commits は、コミットメッセージのための軽量の規約です。

規約に従うことで、各種ツールによる自動処理が可能になります(例えば JReleaser が CHANGELOG をいい感じに自動生成するなど)。

コミットメッセージは以下の様に設定します。

git commit -m "<type>([optional scope]): <description>" \
  -m "[optional body]" \
  -m "[optional footer]"

つまり以下のような形式になります。

<type>([optional scope]): <description>

[optional body]

[optional footer]

<type> は、Conventional Commits 1.0.0 仕様では、fixfeat が定義されています(その他、プロジェクト毎に任意の type を定義して使用することも可)。

  • feat アプリケーションやライブラリに新しい機能を追加するコミット
  • fix アプリケーションやライブラリのバグ修正を行うコミット

例えば、機能追加のコミットメッセージは以下のようになります。

feat: allow provided config object to extend other configs

API の破壊的変更を伴うコミットは、: の前に ! を付与するか、フッター に BREAKING CHANGE: に続き、破壊的な変更内容を説明します(両方でも可)。

例えば以下のようになります。

feat!: allow provided config object to extend other configs

BREAKING CHANGE: `extends` key in config file is now used for extending other config files

optional scope には、コミットの型に追加の文脈情報を指定できます。 以下のように括弧で囲み、プロジェクト毎に定めた任意のスコープを付与します。

feat(api)!: send an email to the customer when a product is shipped

その他、optional body, optional footer には任意のメッセージを記載できます。


追加の type

Angular の規約 では以下が定義されています。

type 説明
build ビルドシステムや外部依存関係に影響する変更
ci CI の設定ファイルやスクリプトに対する変更
docs ドキュメントのみの変更
perf パフォーマンスを改善するためのコード変更
refactor バグ修正でも機能追加でもないコード変更
style コードの意味に影響を与えない変更(空白、書式、セミコロンの欠落など)
test 不足しているテストの追加や既存のテストの修正

git-conventional-commits では以下が定義されています。

type 説明
refactor API や UI の動作を変更せずにコードを書き直したり再構築したりするコミット
perf 特にパフォーマンスを向上させる特別なタイプのコミット
style コードスタイルに対処し、アプリケーションの動作に影響を与えないコミット
test 不足しているテストを追加したり、既存のテストを修正するコミット
build ビルド ツール、依存関係、プロジェクト バージョン、CI/CD パイプラインなどのビルド関連コミット
ops インフラストラクチャ、展開プロセス、バックアップ、回復手順などの運用面に影響を与えるコミット
docs ドキュメントのみに影響するコミット
chore その他のコミット(.gitignore の変更など)

これらを参考にプロジェクト毎に定義することになるでしょう。


Semantic Versioning との対応

Semantic Versioning では、バージョンナンバーは、MAJOR.MINOR.PATCH とし、バージョンを上げるには、

  1. APIの変更に互換性のない場合はMAJORバージョンを、
  2. 後方互換性があり機能性を追加した場合はMINORバージョンを、
  3. 後方互換性を伴うバグ修正をした場合はPATCHバージョンを上げます。

とされており、Conventional Commits では以下のように対応付けられています。

コミット SemVer
BREAKING CHANGE MAJOR
feat MINOR
fix PATCH
その他 未規定

なお、git-conventional-commits では以下のように扱われています。

コミット SemVer
BREAKING CHANGE MAJOR
fix MINOR
feat MINOR
その他 PATCH