【Git基礎】コミットメッセージ規約 – 「Conventional Commits」の基本

目次

はじめに

この記事では、コミットメッセージ規約 Conventional Commits の内容について要約しつつ、各項目の内容や例をまとめています。

※この記事の内容は要約が主なものとなります。元となる情報やその詳細については以下ページをご参照ください。

Conventional Commits
Conventional Commits 人間と機械が読みやすく、意味のあるコミットメッセージにするための仕様

運用上のメリット

コミットメッセージの形式を明確に定めておくことには、以下のような運用上のメリットがあります。

  • 自動リリースノート生成(Conventional Commits → semantic-release 連携)
  • CI/CD パイプラインでの自動バージョニング(major/minor/patch 自動判定)
  • 履歴の検索性向上git log --grep=feat で機能追加だけ見れる)
  • タグ管理と整合性v1.2.3 タグとコミット内容が一貫する)

コミットメッセージのフォーマット

Conventional Commits で提示されているコミットメッセージのフォーマットは以下です。

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

[optional body]

[optional footer(s)]

日本語訳:

<型> ([任意 スコープ]) : <タイトル>

[任意 本文]

[任意 フッター]

任意(optional)の項目と必須の項目があり、必須だけの構成とする場合は、以下のようになります。

<type> : <description>

各項目の内容について、以下にまとめます。

必須の項目

まずは必須項目であるタイトルについて確認しておきましょう。

型(type)

型(type)必須項目で、コミット(≒変更内容)の種類を記載します。

型の種類は開発メンバーで合意が取れていれば自由ですが、例として以下のようなものが挙げられます。
(以下の用法はあくまで一例のため、参考程度にご参照ください)

型の種類用途メッセージ例
feat新機能の追加feat(auth): add JWT login API
fixバグ修正fix(ui): correct header alignment
hotfix緊急修正
(リリース後、本番環境に直接適用する修正)
hotfix(payment): fix critical bug
docsドキュメント修正docs(readme): update setup guide
styleコードの整形(動作は変更なし)
→インデントや改行など、コードの”見た目”変更
style: format with prettier
refactorリファクタリング(動作は変更なし)
→関数の分割や命名変更など、構造の改善
refactor(order): simplify order calc logic
perfパフォーマンス改善perf(cache): reduce DB calls by 50%
testテスト追加や修正test(api): add unit tests for login
chore開発環境や周辺設定の維持管理に関わる変更
(ビルド関連、CI/CD設定、依存関係更新)
chore(deps): update lodash to v4.17.21

タイトル(description)

タイトル(description)必須項目で、1行で「何をしたか」の要約文を記載します。

記述のポイント
  • 英語の場合は 動詞の原形で開始(add, fix, update, remove…)
  • 末尾にピリオド . を付けない
  • 簡潔に(大体50文字以内が推奨)

任意の項目

続けて、任意で追加する項目についてまとめていきます。

スコープ(scope)

スコープ(scope)は任意の項目で、括弧括りで変更の対象モジュールや機能名を明示します。
ここでの名称は英単語のケバブケース(例: auth, payment-api, ui)で記述することが多いようです。

例:

feat(auth): add refresh token logic
fix(payment-api): correct transaction rollback

本文(body)

本文(body)は任意の項目で、変更理由や詳細を記述します。

「何を、なぜ行ったか」の記述で、「どうやったか」など、コードで表現される部分は冗長に書かないのがポイントです。

フッター(footer)

フッター(footer)は任意の項目で、主に issue番号 や BREAKING CHANGEの明示、関連情報などを記述します。

Issue 追跡

チケット管理を行っている場合はIssueの追跡情報として番号や状態を記述します。

例:

  • Refs: #123 → 関連
  • Fixes: #123 or Closes: #123 → マージ時に自動クローズ

Breaking Change

後方互換性が壊れる変更の場合は、その旨をフッターに明記します。

例:

BREAKING CHANGE: The login API now requires JWT instead of session cookies.
【補足】BREAKING CHANGE (後方互換性を破壊する変更)

BREAKING CHANGE とは“後方互換性を破壊する変更(Breaking Changes)が含まれている”ことを明示するための特別な記述です。

ライブラリ・API・サービスなどで、これまでのコードが動かなくなる/互換性が崩れる 可能性があるときに使用するもので、開発者や利用者への注意の目的があります。

記述方法として、主に以下2種類が使われます。
① フッターに「BREAKING CHANGE: XXXXXXXX」と内容を記載
➁ 方の記述の後に「!」 をつける ( feat!: remove deprecated login API )

例として、以下のような変更の場合は「後方互換性破壊」になることが多いため注意が必要です。

  • APIの仕様変更
  • データ構造(JSON仕様やDBスキーマ変更など)の変更
  • システム要件の変更
  • 設定ファイルのフォーマット変更

実例まとめ

最後にコミットメッセージの実例を以下にまとめておきます。
任意の項目も含めているやや長めの形式にはなるため、あくまで一例としてご参照いただけますと幸いです。

新機能追加

feat(auth): add JWT login API

Implement JWT-based authentication with access and refresh tokens.
This replaces the old session-based login system.

Closes: #101

バグ修正

fix(timezone): correct UTC+9 conversion in scheduler

Jobs were running twice on the DST switch date due to miscalculation.
Fixed by using moment-timezone library.

Refs: #234

緊急 Hotfix

hotfix(payment): fix critical bug in payment API

Production transactions were failing due to null pointer in order service.
Applied immediate fix and patched endpoint.

Fixes: #789

Breaking Change を含むリファクタ

refactor(user): migrate ID from int to UUID

Changed primary key of users table to UUID for better scalability.

BREAKING CHANGE: User IDs are now UUIDs instead of integers.
Clients must update their schema.

Closes: #567

おすすめの本:

おすすめの本:


ここまでお読みいただき、ありがとうございます。
今回紹介した内容が、皆さんの開発のヒントになれば幸いです。

記事が役に立ったと感じていただけましたら、OFUSE にてご支援いただけますと今後の運営の励みになります。

OFUSEで応援を送る

今後もゲーム制作に関するさまざまな情報や、そこから得られた知見を共有していく予定ですので、引き続き当ブログをよろしくお願いいたします。

  • URLをコピーしました!
目次