| name | split-commit |
| description | git diff の変更(staged・unstaged 両方)を hunk 単位で分析し、論理的に最小のコミットに分割して自動コミットする。変更が溜まっているとき、複数の変更をまとめてコミットしたいとき、差分を整理してコミットしたいときに使う。TRIGGER when: 'split commit'、'コミット分割'、'差分を整理してコミット'、'変更をまとめてコミット'、'hunkごとにコミット'、'論理的にコミットを分けて'、'auto commit split'、'コミットを分けたい'、'まとめてコミットして' などのフレーズや、未コミットの変更が複数の論理的な変更を含んでいてユーザーが整理を求めているとき。 |
Split Commit
ワーキングツリーの変更を分析し、hunk 単位で論理的に最小のコミットへ自動分割するスキル。
ワークフロー
Step 1: 差分の取得
-
untracked ファイルを tracking 対象にする(diff に含めるため):
git ls-files --others --exclude-standard
untracked ファイルがあれば git add -N <file> で intent-to-add にする。
-
全変更の統合 diff を取得:
git diff HEAD -U3
staged と unstaged の両方が HEAD との差分として出る。
-
diff が空なら「コミットする変更がありません」と伝えて終了。
Step 2: Hunk の分析とグルーピング
diff を hunk 単位で読み、各 hunk を以下の観点で分類する:
- 目的: 何を達成する変更か(バグ修正、機能追加、リファクタ、設定変更、ドキュメント更新など)
- スコープ: どの機能・モジュール・概念に属するか
- 依存関係: 他の hunk と一緒でないと壊れるか
同じ論理的変更に属する hunk をグループにまとめる。判断基準:
- 同じファイル内でも、異なる関数・異なる目的の変更は別グループにする
- 異なるファイルでも、同じ機能に関する変更(例: 実装とそのテスト)は同じグループにする
- import 文の追加は、そのシンボルを使う変更と同じグループにする
- 迷ったら分ける(小さいコミットの方が安全)
各グループに対して:
- 簡潔なコミットメッセージを決める(Conventional Commits 形式:
feat:, fix:, refactor:, docs:, chore: など)
- そのグループに含まれるファイルと hunk 範囲を記録する
Step 3: 安全なバックアップ
コミット操作を始める前に、現在の変更を安全に保存する:
git stash --include-untracked -m "split-commit: backup before splitting"
これにより、何か問題が起きても git stash pop で元に戻せる。
Step 4: グループごとにパッチ適用 → コミット
各グループについて以下を繰り返す:
-
パッチファイル作成: そのグループの hunk だけを含む unified diff をファイルに書き出す。
- パッチは正しい unified diff 形式にする(
---, +++, @@ ... @@ ヘッダ、コンテキスト行を含む)
- 新規ファイル(
/dev/null からの diff)の場合はファイル全体をパッチに含める
-
パッチ適用:
git apply --index "$TMPDIR/patch-N.diff"
--index で working tree と index の両方に適用する。
-
コミット:
git commit -m "<type>: <message>"
-
エラー時: git apply が失敗したら、そのグループを飛ばさずに原因を調べる。コンテキスト行のずれが原因なら、前のコミットで変わった行番号を考慮してパッチを修正する。
Step 5: クリーンアップ
全グループのコミットが完了したら:
git stash drop
最後に git log --oneline -<N> で作成したコミットの一覧を表示する(N = コミット数)。
エラーリカバリ
途中で失敗した場合:
git reset --soft HEAD~<成功したコミット数>
git stash pop
これで元の状態に戻り、ユーザーに状況を報告する。
コミットメッセージのルール
- Conventional Commits 形式を使う
- スコープは省略可(明確な場合のみ付ける)
- 本文は不要(タイトル行のみ)
- CLAUDE.md に Co-Authored-By ルールがある場合はそれに従う
注意事項
- マージコンフリクト中は実行しない(
git status で確認)
- リベース中・チェリーピック中も実行しない
- submodule の変更は個別のコミットにする
- バイナリファイルはパッチ適用できないため、単独でファイル単位のコミットにする