2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Code でgit/ghのコミット・PRを自動化する

2
Posted at

コードを書いた後、毎回コミットメッセージを考えたり、PullRequest(以下、PR)の説明を書いたりするのに時間をかけていませんか?
コミットメッセージというのは、詩のようなもので、中には語られるようなコミットメッセージが生まれたりして面白いですが。

この記事では、Claude Code CLI を使って、以下の2つを自動化するエイリアスを作成していきます。

  • コミットメッセージの自動生成
  • PR のタイトル・本文の自動生成

前提

  • Claude Code がインストールされ、claude コマンドが使える
  • GitHub CLI がインストールされ、gh コマンドが使える

コミットメッセージの自動生成

ここでは、git aicommit または、 git aicommit --detail と入力すると、Claude code が実際にコミットメッセージを生成するエイリアスを作成します。

仕組み

以下のような仕組みのコマンドを目指します。

git aicommit を実行
       ↓
① git diff --cached の内容を Claude に渡す
       ↓
② Claude がコミットメッセージを生成
       ↓
③ git commit -m "..." -e でコミット(エディタで確認)

セットアップ

以下のコマンドをターミナル上で実行します。
このコマンドは、git alias を ~/.gitconfig ファイルに追加するコマンドです。
具体的なコマンドの説明は、後ほど行います。

git config --global alias.aicommit '!f() { \
  if [ "$1" = "--detail" ]; then \
    COMMITMSG=$(claude --no-session-persistence --print "Generate a Git commit message in Japanese based strictly on the contents of `git diff --cached`. Format it as follows: First line: a concise one-line summary. Then a blank line. Then a detailed bullet-point list explaining what was changed and why. Output ONLY the commit message, no extra explanation."); \
  else \
    COMMITMSG=$(claude --no-session-persistence --print "Generate ONLY a one-line Git commit message in Japanese. The message should summarize what was changed and why, based strictly on the contents of `git diff --cached`. DO NOT add an explanation or a body. Output ONLY the commit summary line."); \
  fi; \
  git commit -m "$COMMITMSG" -e; \
}; f'

使い方

# ステージングしてから実行
git add .

# シンプルな1行メッセージ
git aicommit

# 詳細なbullet point付きメッセージ
git aicommit --detail

生成されるメッセージの例

git aicommit

ユーザー認証機能を追加

git aicommit --detail

ユーザー認証機能を追加

- JWTトークンによるセッション管理を実装
- ログイン・ログアウトのエンドポイントを追加
- パスワードのハッシュ化にbcryptを使用

コードのポイント解説

! プレフィックス
Git エイリアスの先頭に ! をつけると、Git コマンドではなくシェルコマンドとして実行されます。

f() { ... }; f パターン
関数を定義してすぐ呼ぶことで、複数コマンドを順番に実行できます。

--no-session-persistence
会話履歴を保存しない使い捨ての呼び出しにします。

--print
対話モードを起動せず、結果だけ標準出力に出します。

$1 による分岐
git aicommit --detail と打つと $1--detail が入り、詳細プロンプトが発火します。

git commit -e
エディタを開いて確認・編集できるようにします。Claude の生成結果をそのまま使うのではなく、人間が最終確認できる余地を残しています。

PR を自動生成

ここでは、先ほどの内容を応用して、PRのタイトルと本文を Claude Code が実際に生成する GitHub CLI エイリアスを作成します。

仕組み

以下のような仕組みのコマンドを目指します。

gh pr aicreate を実行
       ↓
① マージ先ブランチとの差分(log + diff)を取得
       ↓
② PRテンプレートの有無を確認
       ↓
③ Claude がタイトル・本文を生成
       ↓
④ gh pr create でブラウザを開いて確認

なぜ gh aliasなのか
git alias でも実装は可能です。しかし、gh alias にするメリットがあります。

  • ~/.config/gh/config.yml に保存されるので、.gitconfig ファイルを無駄に汚さない
  • gh pr のサブコマンドとして自然に使える
  • GitHubを操作するという意味合いで、gh コマンドとしての責務が一致している

セットアップ

gh alias set 'pr aicreate' '!f() { \
  BASE=${1:-main}; \
  DIFF=$(git log $BASE..HEAD --oneline; echo "---"; git diff $BASE); \
  TEMPLATE=$(cat .github/pull_request_template.md 2>/dev/null || cat .github/PULL_REQUEST_TEMPLATE.md 2>/dev/null || echo ""); \
  TITLE=$(claude --no-session-persistence --print "Based on these git changes, generate ONLY a one-line Pull Request title in Japanese. Output ONLY the title, nothing else.\n\n$DIFF"); \
  if [ -n "$TEMPLATE" ]; then \
    BODY=$(claude --no-session-persistence --print "Based on these git changes, generate a Pull Request body in Japanese. You MUST follow this PR template exactly:\n\n$TEMPLATE\n\nFill in each section based on the changes. Output ONLY the body.\n\n$DIFF"); \
  else \
    BODY=$(claude --no-session-persistence --print "Based on these git changes, generate a Pull Request body in Japanese using markdown format. Include these sections: ## 変更内容, ## 変更理由, ## 備考. Output ONLY the body.\n\n$DIFF"); \
  fi; \
  gh pr create --title "$TITLE" --body "$BODY" --web; \
}; f'

使い方

# mainへのPR(デフォルト)
gh pr aicreate

# 特定ブランチへのPR
gh pr aicreate feature/xxx

コードの解説

BASE=${1:-main}
引数が渡されなかった場合のデフォルト値を main にする書き方です。feature/xxx へのPRを作りたい場合は gh pr aicreate feature/xxx と指定します。

git log $BASE..HEAD --onelinegit diff $BASE の両方を渡す理由

コマンド 分かること
git log 何のコミットをしたか(概要)
git diff 実際にどのコードが変わったか(詳細)

両方渡すことで Claude がより文脈を理解したPRを生成できます。

PRテンプレートの自動検出

TEMPLATE=$(cat .github/pull_request_template.md 2>/dev/null \
        || cat .github/PULL_REQUEST_TEMPLATE.md 2>/dev/null \
        || echo "")

2>/dev/null でファイルが存在しないエラーを握りつぶし、|| で複数のパスを順番に試します。

[ -n "$TEMPLATE" ]
-n は「文字列が空でない場合に真」を返します。テンプレートの有無で Claude へのプロンプトを切り替えています。

テンプレートあり → テンプレートのセクションを厳守して埋める
テンプレートなし → ## 変更内容, ## 変更理由, ## 備考 で自由生成

--web
ブラウザでPR作成画面を開き、送信前に内容を確認・編集できます。自動でPRが作成されないので安心です。

まとめ

コマンド 動作
git aicommit 1行のコミットメッセージを自動生成
git aicommit --detail 詳細なbullet point付きコミットメッセージを自動生成
gh pr aicreate mainへのPRを自動生成
gh pr aicreate feature/xxx 指定ブランチへのPRを自動生成

Claude Code を CLI ツールとして組み合わせることで、普段の Git ワークフローに自然にAIを組み込めます。どちらも最終的にエディタやブラウザで確認できるので、安心して使えます。

ぜひ試してみてください。

参考・謝辞

本記事の git aicommit のベースとなるアイデアは、以下の記事から着想を得ました。シンプルかつ実用的なアプローチを共有してくださった hfm さん、KOBA789さんに感謝いたします。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?