コンテンツにスキップ

コミットメッセージ規約

この章では、チーム開発で使われるコミットメッセージの規約と、自動チェックの方法を学びます。

  1. 履歴の可読性: 変更内容が一目でわかる
  2. 自動化: CHANGELOG生成、バージョン管理
  3. レビュー効率: PRの内容を素早く把握
  4. 検索性: 特定の変更を見つけやすい

最も広く使われているコミットメッセージの規約です。

<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
feat: ユーザー認証機能を追加
Google OAuthによるログイン機能を実装しました。
- ログイン/ログアウトフロー
- セッション管理
- プロフィール取得
Closes #123
タイプ説明
feat新機能feat: 検索機能を追加
fixバグ修正fix: ログインエラーを修正
docsドキュメントdocs: READMEを更新
styleスタイル(動作に影響なし)style: コードフォーマット
refactorリファクタリングrefactor: 認証ロジックを整理
perfパフォーマンス改善perf: クエリを最適化
testテストtest: ユーザーAPIのテスト追加
buildビルド関連build: webpack設定を更新
ciCI関連ci: GitHub Actions追加
choreその他chore: 依存関係を更新
revertリバートrevert: feat: 検索機能を追加

後方互換性を壊す変更には ! を付けるか、フッターに BREAKING CHANGE: を記載:

feat!: APIのレスポンス形式を変更
BREAKING CHANGE: レスポンスのdata配列がobjectに変更されました

変更の影響範囲を示します。

feat(auth): ログイン機能を追加
fix(api): エンドポイントのエラーを修正
docs(readme): インストール手順を更新
プロジェクトスコープ例
Webアプリauth, api, ui, db
モノレポfrontend, backend, shared
ライブラリcore, utils, types
Terminal window
# ✅ 良い例: 具体的で簡潔
feat: ユーザーの検索フィルター機能を追加
fix: 購入時の在庫チェックが無効になる問題を修正
refactor: 認証ミドルウェアをクラスベースに変更
# ❌ 悪い例: 曖昧または冗長
feat: 機能追加
fix: バグを修正
feat: ユーザーが商品を検索するときにフィルターを使って絞り込みができるようにする機能を追加しました
  1. 命令形で書く: 「追加した」ではなく「追加」
  2. 先頭は小文字(日本語の場合は自然に)
  3. 末尾にピリオドなし
  4. 50文字以内を目安に

詳細な説明が必要な場合に使用します。

fix: 決済処理のタイムアウトエラーを修正
外部決済APIのレスポンス時間が長い場合に
タイムアウトが発生していた問題を修正。
変更内容:
- タイムアウト時間を10秒から30秒に延長
- リトライロジックを追加(最大3回)
- エラーハンドリングを改善
  1. タイトルと本文は空行で区切る
  2. 72文字で折り返す(読みやすさのため)
  3. What(何を)Why(なぜ) を説明
  4. How(どうやって)はコードを見ればわかる
feat: ダッシュボードにグラフを追加
Closes #123
Refs #456, #789
fix: 複数の入力バリデーションエラーを修正
Fixes #111
Fixes #222
Fixes #333
feat: 新しいレポート機能を追加
Co-authored-by: Name <email@example.com>
Co-authored-by: Another <another@example.com>
Terminal window
npm install --save-dev @commitlint/{cli,config-conventional}
commitlint.config.js
module.exports = {
extends: ['@commitlint/config-conventional'],
rules: {
'type-enum': [
2,
'always',
[
'feat',
'fix',
'docs',
'style',
'refactor',
'perf',
'test',
'build',
'ci',
'chore',
'revert',
],
],
'subject-case': [0], // 日本語対応のため無効化
'subject-max-length': [2, 'always', 72],
},
};
Terminal window
npm install --save-dev husky
npx husky init
echo "npx --no -- commitlint --edit \$1" > .husky/commit-msg
name: Commitlint
on:
pull_request:
branches: [main]
jobs:
commitlint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup Node
uses: actions/setup-node@v4
with:
node-version: 20
- name: Install dependencies
run: npm ci
- name: Validate commits
run: npx commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose
Terminal window
npm install --save-dev standard-version
package.json
{
"scripts": {
"release": "standard-version"
}
}
Terminal window
# リリース
npm run release
# 出力例:
# CHANGELOG.md が更新される
# バージョンが自動で上がる
# タグが作成される
# Changelog
## [1.2.0](https://github.com/user/repo/compare/v1.1.0...v1.2.0) (2024-01-15)
### Features
* ユーザー検索機能を追加 ([#123](https://github.com/user/repo/issues/123)) ([abc1234](https://github.com/user/repo/commit/abc1234))
* ダッシュボードにグラフを追加 ([#456](https://github.com/user/repo/issues/456)) ([def5678](https://github.com/user/repo/commit/def5678))
### Bug Fixes
* ログインエラーを修正 ([#789](https://github.com/user/repo/issues/789)) ([ghi9012](https://github.com/user/repo/commit/ghi9012))

コミットメッセージテンプレート

Section titled “コミットメッセージテンプレート”
Terminal window
# テンプレートを作成
cat > ~/.gitmessage << 'EOF'
# <type>(<scope>): <subject>
#
# <body>
#
# <footer>
#
# --- TYPES ---
# feat: 新機能
# fix: バグ修正
# docs: ドキュメント
# style: フォーマット(動作に影響なし)
# refactor: リファクタリング
# perf: パフォーマンス改善
# test: テスト
# build: ビルド関連
# ci: CI関連
# chore: その他
EOF
# Gitに設定
git config --global commit.template ~/.gitmessage
Terminal window
# 直前の5コミットを整理
git rebase -i HEAD~5
# エディタで操作
# pick -> 保持
# reword -> メッセージ変更
# squash -> 前のコミットと統合
# fixup -> 統合(メッセージ破棄)
# drop -> 削除

コミットメッセージから自動でリリース:

.github/workflows/release.yml
name: Release
on:
push:
branches: [main]
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npx semantic-release
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

項目内容
形式<type>(<scope>): <description>
タイプfeat, fix, docs, style, refactor, perf, test, build, ci, chore
説明命令形、50文字以内、具体的に
本文空行後に詳細、72文字折り返し
自動化commitlint, standard-version

コミットメッセージのベストプラクティス

Section titled “コミットメッセージのベストプラクティス”
  1. 1コミット = 1つの変更: 複数の変更を混ぜない
  2. レビュアーを意識: 後で読む人のために書く
  3. 自動化を活用: commitlintでルールを強制
  4. チームで合意: 規約をドキュメント化して共有

次の章では、PR運用ルールについて学びます。

Q1. Conventional Commitsの基本形式として正しいものはどれですか?

Q2. 破壊的変更を示す方法として正しいものはどれですか?

Q3. commitlintツールの役割はどれですか?