はじめに
プルリクエストのコミット履歴を眺めていて、「fix」「update」「wip」ばかりが並んでいてげんなりした経験はないでしょうか。あとから「このコミットは何のための修正だったのか」を調べようとしても、メッセージからは何も読み取れず、結局差分を1行ずつ追うことになる。チームの人数が増えるほど、この積み重ねは地味に効いてきます。
Commitizenは、git commitをインタラクティブなプロンプトに置き換えることで、この問題を仕組みで解決するCLIツールです。コミットのたびに「変更の種類」「影響範囲」「概要」を対話形式で答えるだけで、規約に沿ったメッセージが自動で組み立てられます。書き手の気分やその日の忙しさに左右されず、誰がコミットしても同じフォーマットになるのが最大の利点です。
Commitizenとは
Commitizenは、コミットメッセージの規約をチームに浸透させるためのコマンドラインツールです。git commitの代わりにgit cz(またはcz)を実行すると、対話形式のプロンプトが立ち上がり、質問に答えていくだけでフォーマットの整ったコミットメッセージが生成されます。
npmパッケージ名はcommitizen、リポジトリ名はcz-cliです。デフォルトではConventional Commitsに準拠したcz-conventional-changelogアダプターが使われますが、アダプターを差し替えることでJira連携や絵文字コミットなど、チームの運用に合わせたカスタマイズも可能です。
主な特徴
- インタラクティブなプロンプト -
feat/fix/docsといった変更種別や影響範囲、概要、破壊的変更の有無を対話形式で入力するだけで、規約に沿ったコミットメッセージが組み上がる - アダプターによる拡張性 -
cz-conventional-changelogが標準だが、cz-emojiやcz-jira-smart-commit、自作のcz-customizable設定など、アダプターを差し替えるだけでルールを変更できる - 既存のGitワークフローと共存 -
git commit自体を置き換えるわけではないため、通常のコマンドとgit czを状況に応じて使い分けられる --retryによる再試行 - テスト失敗などでコミットが中断した場合、git cz --retryで入力し直さずに同じメッセージで再コミットできる
インストール
グローバルにインストールして使う場合です。
npm install -g commitizen
プロジェクト単位で導入する場合は、開発依存として追加したうえでcommitizen initで初期化します。
npm install --save-dev commitizen
npx commitizen init cz-conventional-changelog --save-dev --save-exact
commitizen initを実行すると、package.jsonに以下のような設定が自動で追加され、どのアダプターを使うかがプロジェクトに紐づきます。
{
"config": {
"commitizen": {
"path": "./node_modules/cz-conventional-changelog"
}
}
}
基本的な使い方
セットアップが終わったら、git addでステージングしたあとgit commitの代わりにgit czを実行します。
git add .
git cz
すると次のような質問が順番に表示され、答えていくだけでコミットメッセージが完成します。
? Select the type of change that you're committing: (Use arrow keys)
❯ feat: A new feature
fix: A bug fix
docs: Documentation only changes
style: Changes that do not affect the meaning of the code
refactor: A code change that neither fixes a bug nor adds a feature
? What is the scope of this change (e.g. component or file name): auth
? Write a short, imperative tense description of the change:
add OAuth login support
? Provide a longer description of the change: (press enter to skip)
? Are there any breaking changes? No
? Does this change affect any open issues? No
最終的に生成されるコミットメッセージは、Conventional Commitsの形式に沿った次のようなものになります。
feat(auth): add OAuth login support
npmのscriptsに登録しておけば、npm run commitのように呼び出せるので、チームメンバーに「git czを覚えて」と説明する手間も減らせます。
{
"scripts": {
"commit": "cz"
}
}
実践的なユースケース
huskyと組み合わせて規約を強制する
git czはあくまで「使えば規約に沿ったメッセージが作れる」ツールなので、誰かが従来どおりgit commit -m "fix"と打てば素通りしてしまいます。これを防ぐには、huskyやcommitlintと組み合わせて、コミットメッセージ自体をcommit-msgフックで検証するのが定番です。
npm install --save-dev husky @commitlint/cli @commitlint/config-conventional
npx husky init
echo 'npx --no -- commitlint --edit "$1"' > .husky/commit-msg
// commitlint.config.js
module.exports = { extends: ['@commitlint/config-conventional'] };
これでgit czを使わずに規約違反のメッセージでコミットしようとすると、フックがはじいてくれます。「使ってね」というお願いベースの運用から、「規約に沿わないと通らない」という仕組みベースの運用に変えられるのがポイントです。
cz-customizableで社内ルールに合わせる
デフォルトのcz-conventional-changelogは英語圏標準のfeat/fix分類ですが、チーム独自の変更種別(例: choreの代わりにenvを使いたい、日本語の説明を許可したいなど)を使いたい場合は、cz-customizableアダプターに差し替えて設定ファイルでプロンプトの内容そのものをカスタマイズできます。
npm install --save-dev cz-customizable
{
"config": {
"commitizen": {
"path": "node_modules/cz-customizable"
}
}
}
// .cz-config.js
module.exports = {
types: [
{ value: 'feat', name: 'feat: 新機能の追加' },
{ value: 'fix', name: 'fix: バグ修正' },
{ value: 'env', name: 'env: 環境構築・設定変更' },
],
scopes: ['api', 'web', 'infra'],
allowCustomScopes: true,
subjectLimit: 72,
};
質問文自体を日本語化したり、scopesをプロジェクトのディレクトリ構成に合わせて選択式にしたりできるので、Conventional Commitsをそのまま使うには抵抗があるチームでも導入しやすくなります。
CIでの再試行にgit cz --retryを使う
コミットメッセージの入力後、pre-commitフックのテストが落ちてコミット自体が中断されることがあります。その場合、もう一度最初から質問に答え直すのは地味にストレスです。git cz --retryを使うと、直前に入力した内容を保持したまま、テストだけをやり直してそのままコミットできます。
git cz
# → pre-commitフックのテストが失敗し、コミットが中断される
# テストを直したあと、入力し直さずに再コミット
git cz --retry
CIの手前でローカルのlintやテストをpre-commitフックに仕込んでいるプロジェクトほど、この機能の恩恵は大きくなります。
まとめ
Commitizenは、コミットメッセージという「書き手のその日の気分に左右されやすい部分」を、対話形式のプロンプトという仕組みに置き換えてくれるツールです。cz-conventional-changelogをそのまま使うだけでも十分効果がありますが、cz-customizableでチーム独自のルールに合わせたり、huskyやcommitlintと組み合わせて規約を強制したりすることで、履歴の質をさらに底上げできます。
コミットログが将来のCHANGELOGやリリースノートの元になることを考えると、今日からgit czを1回試してみる価値は十分にあるはずです。
