チームのGitの履歴を見返したとき、こんな状態になっていませんか?
- 「修正」「update」「fix」だけのコミットがずらっと並んでいる
- どのコミットで機能が追加されたのか、履歴から追いかけられない
- リリースノートを書くたびに、変更内容を一つずつ思い出している
コミットメッセージは、未来の自分とチームメンバーへの「申し送り」です。
今回は、コミットメッセージの書き方を揃えるためのルール「Conventional Commits」を紹介します。
履歴が読めないと何が困るのか
コミットメッセージがバラバラだと、困るのは「あとから調べるとき」です。
- 不具合の原因になった変更を探したいとき
- 「この機能はいつ入ったんだっけ?」と確認したいとき
- リリースのたびに、変更点をまとめたいとき
どれも、メッセージを読んだだけで変更の種類がわかれば、すぐに終わる作業です。
Conventional Commitsの基本形
Conventional Commitsでは、コミットメッセージを次の形で書きます。
- 1
- 2
- 3
- 4
- 5
<type>(<scope>): <description>
[本文(任意)]
[フッター(任意)]type には、変更の種類を書きます。よく使われるのは次のとおりです。
-
feat:新しい機能の追加 -
fix:バグの修正 -
docs:ドキュメントだけの変更 -
refactor:機能を変えないコードの整理 -
test:テストの追加や修正 -
chore:ビルド設定や依存関係の更新など、その他の作業
scope は省略できます。変更した範囲(画面名や機能名など)を書いておくと、さらにわかりやすくなります。
実際の例
- 1
- 2
- 3
- 4
feat(login): パスワード再設定メールの送信機能を追加
fix(cart): 数量が0のときに合計金額がマイナスになる不具合を修正
docs: READMEにセットアップ手順を追記
chore: 依存パッケージを更新description は日本語でもかまいません。大切なのは、先頭の type を揃えることです。
ちなみに、このブログのリポジトリでも feat:、fix:、chore: などの形でコミットしています。
また、互換性がなくなる大きな変更(破壊的変更)は、type の後ろに ! を付けるか、フッターに BREAKING CHANGE: と書いて示します。
- 1
- 2
- 3
feat!: APIのレスポンス形式を変更
BREAKING CHANGE: user_name を name に変更しましたこのルールに沿って書いておくと、履歴からリリースノートを自動生成するツールも使えるようになります。
ルールを守る仕組みを作る
「ルールを決めたけど、だんだん守られなくなる」というのはよくある話です。
そこで、commitlint というツールを使うと、コミットのタイミングでメッセージの形式をチェックできます。
Node.jsのプロジェクトであれば、次のように導入できます。
- 1
- 2
- 3
- 4
npm install --save-dev @commitlint/cli @commitlint/config-conventional husky
echo "export default { extends: ['@commitlint/config-conventional'] };" > commitlint.config.mjs
npx husky init
echo "npx --no -- commitlint --edit \$1" > .husky/commit-msgこれで、形式に合わないメッセージでコミットしようとすると、エラーで止めてくれるようになります。
なお、npx husky init を実行すると npm test を実行する .husky/pre-commit も作成されます。不要な場合は削除しておきましょう。
また、CursorなどのAIエディタには、変更内容からコミットメッセージを提案してくれる機能があります。
Rulesなどで「Conventional Commitsの形式で書く」と伝えておけば、形式の揃ったメッセージを提案してもらいやすくなります。
まとめ
今回は、コミットメッセージを揃えるためのルール「Conventional Commits」を紹介しました。
- 先頭に
featやfixなどのtypeを付ける - 破壊的変更は
!やBREAKING CHANGE:で示す - commitlintで、ルールを守る仕組みを作る
チームのGitを快適にするには、.gitignore の整備もおすすめです。
チームのGitが毎日荒れる意外な原因、実は「.gitignore」にあった?
まずは次のコミットから、type を付けるところから始めてみてくださいね。