コミットメッセージに迷ったら「Conventional Commits」を試してみる

技術情報
技術情報

はじめに

チームで開していると、他人のコミットログを眺める機会が地味に多い。
そんなとき、更新 とか fix とか いろいろ修正 みたいなメッセージが並んでいると、正直なところ何が起きたのか全然わからない。
自分が過去に書いたものですら、3ヶ月後に見ると意味不明だったりする。

その「とりあえずコミットメッセージ問題」に一定の答えを出してくれるのが Conventional Commits というルールです。
今回はこれがどういうものか、ざっくり紹介します。

要するに、書き方を決めておくだけ

難しい仕組みではありません。コミットメッセージの先頭に「種類」を書く、というシンプルな約束事です。
基本の形はこれだけ。

type(scope): description

具体的にはこんな感じになります。

feat(auth): ログイン機能を追加
fix(api): ユーザー取得時のnullエラーを修正
docs: READMEのインストール手順を更新

scope(どこを触ったか)は省略してもOKで、feat: ログイン機能を追加 だけでも成立します。
最初は迷ったら付けない、くらいの気持ちで十分。

type は最初の数個だけ覚えればいい

公式が定めている type はいくつかありますが、実務で頻繁に使うのは限られています。

  • feat … 新機能を追加したとき
  • fix … バグを直したとき
  • docs … ドキュメントだけの変更
  • refactor … 機能は変えず、内部を整理したとき
  • test … テストの追加・修正
  • chore … ビルド設定やライブラリ更新など、雑多なもの

このあたりに style(フォーマット整形)や perf(パフォーマンス改善)が加わるくらい。
全部暗記しようとすると挫折するので、まずは featfix の使い分けから始めるのが現実的だと思います。

「破壊的変更」だけは特別扱い

互換性が壊れる変更、いわゆる Breaking Change については、ちゃんと目立たせる書き方が用意されています。
type のうしろに ! を付けるのが手軽です。

feat(api)!: レスポンス形式をJSONに統一

もっと丁寧に書くなら、本文に BREAKING CHANGE: から始まる説明を入れます。

feat(api): レスポンス形式を変更

BREAKING CHANGE: これまでXMLで返していたレスポンスをJSONに変更しました。
旧クライアントは動作しなくなります。

ここを雑にすると後で泣くので、破壊的変更だけはサボらないほうがいいです。

何が嬉しいのか

ルールを守って書くのは最初こそ面倒に感じます。
でも、続けていると地味に効いてくる場面がいくつかあります。

ひとつは、ログがそのまま履歴として読めること。
feat を拾えば「この期間に何が増えたか」がひと目でわかるし、fix を追えば不具合の傾向も見えてきます。

もうひとつは、自動化と相性がいいこと。
Conventional Commits に沿っていれば、コミットログから CHANGELOG を自動生成したり、バージョン番号を自動で上げたりするツールがそのまま使えます。
feat ならマイナーバージョン、fix ならパッチ、BREAKING CHANGE ならメジャー、といった具合に、セマンティックバージョニングともきれいに対応します。

つまり、人が読んでわかりやすいだけじゃなくて、機械にも処理させやすい。この両取りができるのが一番の強みだと思っています。

ルールを覚えるのが大変? → skill にお任せ

「ルールを全員に覚えてもらうのが大変そう」という心配もありますが、その必要はありません。
下記の skill を使えば、ルールを知らなくても変更内容を確認し、コミットメッセージを自動生成できます。
導入は次のコマンドを実行するだけです。

bash npx skills add https://github.com/github/awesome-copilot --skill git-commit

まずは1週間だけ

コミットメッセージは、未来の自分とチームへのメモみたいなものです。
ほんの少し書き方を整えるだけで、後から見返したときの体験がだいぶ変わります。
だまされたと思って1週間ほど試してみてください。

タイトルとURLをコピーしました