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 仕様では、fix
と feat
が定義されています(その他、プロジェクト毎に任意の 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
とし、バージョンを上げるには、
- APIの変更に互換性のない場合は
MAJOR
バージョンを、 - 後方互換性があり機能性を追加した場合は
MINOR
バージョンを、 - 後方互換性を伴うバグ修正をした場合は
PATCH
バージョンを上げます。
とされており、Conventional Commits では以下のように対応付けられています。
コミット | SemVer |
---|---|
BREAKING CHANGE |
MAJOR |
feat |
MINOR |
fix |
PATCH |
その他 | 未規定 |
なお、git-conventional-commits では以下のように扱われています。
コミット | SemVer |
---|---|
BREAKING CHANGE |
MAJOR |
fix |
MINOR |
feat |
MINOR |
その他 | PATCH |