Agentive
自動化ラボ

AIでgitワークフローを自動化 — commit、PR作成、コードレビューまで

約5分で読めます

AIでgitワークフローを自動化

Claude Codeはgit操作を自律的に行える。コミットメッセージの生成、PR作成、コードレビューまで、開発ワークフローの定型作業をAIに委譲する方法を解説する。

自動コミット: 変更内容を理解したメッセージ生成

Claude Codeでの自動コミット

# 変更を確認して適切なコミットメッセージで自動commit
claude -p "変更内容を確認してdescriptiveなコミットメッセージでcommitしてください"

# 特定のconventionに従う
claude -p "Conventional Commits形式でコミットしてください(feat/fix/docs等)"

Pythonスクリプトでの自動コミット

import subprocess
import anthropic

client = anthropic.Anthropic()

def auto_commit():
    diff = subprocess.run(
        ["git", "diff", "--staged"],
        capture_output=True, text=True
    ).stdout

    if not diff:
        print("ステージングされた変更がありません")
        return

    response = client.messages.create(
        model="claude-haiku-35-20241022",
        max_tokens=100,
        messages=[{
            "role": "user",
            "content": ("以下のgit diffからConventional Commits形式の"
                        "コミットメッセージを1行で生成:\n\n"
                        + diff[:3000])
        }]
    )
    commit_msg = response.content[0].text.strip()
    subprocess.run(["git", "commit", "-m", commit_msg])
    print("コミット完了: " + commit_msg)

auto_commit()

自動PR作成: 変更の要約と説明を自動生成

Claude Codeでの自動PR作成

# 変更内容を要約してPR作成
claude -p "この変更のPRを作成してください。変更内容の要約をbodyに含めてください"

# テンプレートに沿ったPR作成
claude -p "PR作成: タイトルは50文字以内、bodyに変更概要と影響範囲を含めて"

Node.jsでの自動PR作成

const { execSync } = require("child_process");
const Anthropic = require("@anthropic-ai/sdk");
const client = new Anthropic();

async function createPR(baseBranch) {
  baseBranch = baseBranch || "main";

  const commits = execSync(
    "git log " + baseBranch + "..HEAD --oneline"
  ).toString();

  const stats = execSync(
    "git diff " + baseBranch + "...HEAD --stat"
  ).toString();

  const response = await client.messages.create({
    model: "claude-haiku-35-20241022",
    max_tokens: 500,
    messages: [{
      role: "user",
      content: "以下のgitログからPR説明文を生成:\n"
        + "コミット: " + commits + "\n"
        + "統計: " + stats + "\n"
        + "フォーマット: ## 概要 / ## 変更内容 / ## テスト方法"
    }]
  });

  const prBody = response.content[0].text;
  const title = commits.split("\n")[0].substring(0, 50);
  execSync("gh pr create --title '" + title + "' --body-file -",
    { input: prBody });
  console.log("PR作成完了");
}

コードレビュー: AIによる多角的レビュー

Claude Codeでの自動レビュー

# 総合レビュー
claude -p "PR #142をレビュー。セキュリティ、パフォーマンス、テストカバレッジの観点で"

# セキュリティ特化レビュー
claude -p "このPRにセキュリティ上の問題がないかレビュー"

# パフォーマンスレビュー
claude -p "このコードのパフォーマンス問題を指摘して"

Pythonスクリプトでの自動レビュー

def review_pr(pr_number: int) -> dict:
    diff = subprocess.run(
        ["gh", "pr", "diff", str(pr_number)],
        capture_output=True, text=True
    ).stdout

    response = client.messages.create(
        model="claude-sonnet-4-20250514",
        max_tokens=2000,
        messages=[{
            "role": "user",
            "content": ("以下のPR diffをレビュー:\n\n"
                        "観点:\n"
                        "1. バグの可能性\n"
                        "2. セキュリティリスク\n"
                        "3. パフォーマンス問題\n"
                        "4. コードスタイル\n"
                        "5. テストの十分性\n\n"
                        "diff:\n" + diff[:8000])
        }]
    )
    review_text = response.content[0].text

    subprocess.run([
        "gh", "pr", "review", str(pr_number),
        "--comment", "--body", review_text
    ])
    return {"pr": pr_number, "review": review_text}

GitHub Actionsとの連携

CI/CDパイプラインでのAIレビュー

name: AI Code Review
on:
  pull_request:
    types: [opened, synchronize]

jobs:
  ai-review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Get PR diff
        run: git diff origin/main...HEAD > pr_diff.txt

      - name: AI Review
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: python scripts/ai_review.py pr_diff.txt

      - name: Post Review Comment
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          gh pr comment ${{ github.event.pull_request.number }} \
            --body-file review_result.md

ブランチ管理の自動化

自動ブランチ命名

def create_feature_branch(description: str) -> str:
    response = client.messages.create(
        model="claude-haiku-35-20241022",
        max_tokens=50,
        messages=[{
            "role": "user",
            "content": ("以下の説明からgitブランチ名を生成。"
                        "形式: feature/kebab-case(30文字以内)\n\n"
                        + description)
        }]
    )
    branch_name = response.content[0].text.strip()
    subprocess.run(["git", "checkout", "-b", branch_name])
    return branch_name

古いブランチの自動クリーンアップ

claude -p "マージ済みのリモートブランチを一覧表示して、main以外を削除して良いか確認"

git hooks × AI の活用

pre-commitフックでのAIチェック

#!/bin/bash
# .git/hooks/pre-commit
staged_files=$(git diff --staged --name-only)
for file in $staged_files; do
  content=$(git show ":$file" 2>/dev/null)
  if echo "$content" | grep -iE "(api_key|secret|password|token)" > /dev/null; then
    echo "WARNING: $file may contain secrets"
    exit 1
  fi
done

まとめ: AIで自動化すべきgit作業

作業従来の手動時間AI自動化後
コミットメッセージ作成1-2分3秒
PR説明文作成5-10分10秒
コードレビュー15-30分1分
ブランチ命名30秒3秒

関連記事

A

Agentive 編集部

AIエージェントを実際に使い倒す個人開発者。サイト制作の自動化を実践しながら、その知見を発信しています。