Claude CodeでGit差分をレビューする手順|採用・修正・保留を実例で判断

Claude CodeでGit差分をレビューする手順|採用・修正・保留を実例で判断 エンジニア
Claude CodeでGit差分をレビューする手順|採用・修正・保留を実例で判断

Claude CodeでGit差分をレビューする手順|採用・修正・保留を実例で判断

更新日:2026年11月13日

Claude Codeに変更を作らせた後は、説明を読むだけでなく、未追跡・未ステージ・ステージ済みの3種類を確認し、コミットする内容を自分で決めます。 Gitの基本操作ができる開発者向けに、小さなPythonプログラムで手順を再現します。

この記事のAI提案は、レビューを練習するために編集部が作った架空の変更です。Claude Codeの実応答や自動レビュー性能を検証したものではありません。Git操作とPythonテストはローカルで実行しています。

1.既存プロジェクトとは別の場所で題材を作る

GitとPython 3が必要です。POSIX系シェルで次を実行します。実務リポジトリでは実行せず、新しい一時ディレクトリを使ってください。WindowsではWSLなどの環境に合わせて読み替えます。

git_review_dir=$(mktemp -d /tmp/git-review-practice.XXXXXX) || exit 1
cd "$git_review_dir" || exit 1
git init
git config user.name "Guide Example"
git config user.email "guide@example.invalid"
cat > total.py <<'PY'
def total_yen(prices):
    return sum(prices)
PY
cat > README.md <<'TXT'
# 合計金額

整数の円を合計します。
TXT
printf '__pycache__/\n' > .gitignore
git add total.py README.md .gitignore
git commit -m "baseline"

今回の依頼は「整数の円を合計する既存関数に、負数が含まれたらValueErrorを送出する処理を加える。空の一覧は0とする」です。入力は整数のリストに限定し、小数・文字列・通貨換算は今回の対象に含めません。

次の状態を架空のAI提案として作ります。READMEだけを先にステージし、実装は未ステージ、テストと検討メモは未追跡にします。

cat > README.md <<'TXT'
# 合計金額

整数の円を合計します。負数は拒否します。
TXT
git add README.md
cat > total.py <<'PY'
def total_yen(prices):
    if any(price < 0 for price in prices):
        return 0
    return sum(prices)
PY
cat > test_total.py <<'PY'
import unittest
from total import total_yen

class TotalTest(unittest.TestCase):
    def test_positive(self):
        self.assertEqual(total_yen([100, 200]), 300)
    def test_negative(self):
        self.assertEqual(total_yen([100, -1]), 0)
PY
printf '将来は小数の通貨も扱うか検討する。\n' > notes.txt

2.3種類の変更を取りこぼさず読む

git status --short
git diff --stat
git diff --name-only
git diff
git diff --cached

git status --shortは、先頭2桁の位置を区別して読みます。今回の表示は次のとおりです。

M  README.md
 M total.py
?? notes.txt
?? test_total.py
表示・対象 状態 確認方法
M README.md ステージ済み git diff --cached
M total.py 追跡済み・未ステージ git diff
?? test_total.py / notes.txt 未追跡 エディターで全文を開く

通常のgit diffは作業ツリーとステージの比較、git diff --cachedはステージとHEADの比較です。未追跡ファイルはどちらにも出ないため、一覧から全文を読みます。同じファイルにステージ後の編集があれば、両方の差分を確認します。Git公式のdiff解説とstatusの表示形式に基づく区別です。

複数ファイルの主要な変更をまとめると、次のようになります。これは別々の比較結果を読みやすく抜粋したものです。

--- a/README.md
+++ b/README.md
-整数の円を合計します。
+整数の円を合計します。負数は拒否します。
--- a/total.py
+++ b/total.py
 def total_yen(prices):
+    if any(price < 0 for price in prices):
+        return 0
     return sum(prices)

READMEの「拒否」と実装の「0を返す」は一致していません。未追跡のテストも0を期待しているので、python3 -m unittest -vを実行すると2件とも成功します。テスト成功だけでは、依頼した仕様を満たすとは判断できません。

3.採用・修正・保留を記録する

AIへ確認を依頼する場合も、自分で決めた仕様を添えます。秘密情報を含まない教材内の差分を対象に、例えば次のように依頼できます。

未追跡ファイルとステージ済みの変更も含めて確認してください。仕様は「負数はValueError、空のリストは0」です。ファイルごとに仕様との差、追加すべきテスト、未確認の点を示してください。編集やコミットはせず、根拠となる箇所を挙げてください。

この依頼文の実応答は未検証です。AIの説明を採用理由に置き換えず、コードと仕様に照合します。今回の人間側のレビュー記録は次のとおりです。

対象 判断 理由・対応
README.md 採用 負数拒否の方針は依頼と一致。実装修正後に含める
total.py 修正 0では正常な合計と区別できない。ValueErrorにする
test_total.py 修正 誤った期待値を直し、空のリストも追加する
notes.txt 保留 小数対応は今回の仕様外。コミット対象にしない

実装を次の形に修正します。

def total_yen(prices):
    if any(price < 0 for price in prices):
        raise ValueError("negative price")
    return sum(prices)

test_total.pyの負数テストを置き換え、空のリストのテストを追加します。次は修正後の全文です。

import unittest
from total import total_yen

class TotalTest(unittest.TestCase):
    def test_positive(self):
        self.assertEqual(total_yen([100, 200]), 300)
    def test_negative(self):
        with self.assertRaises(ValueError):
            total_yen([100, -1])
    def test_empty(self):
        self.assertEqual(total_yen([]), 0)

4.修正後に、コミット対象をもう一度確認する

python3 -m unittest -v
git add total.py test_total.py
git diff --cached --check
git diff --cached
git status --short

検証では正常値・負数・空のリストの3件が成功しました。--checkは今回終了コード0で、空白エラーなどは報告されませんでした。仕様の正しさを判定する機能ではありません。

最後の状態は次のようになります。READMEは最初にステージ済みです。

M  README.md
A  test_total.py
M  total.py
?? notes.txt

git addは、その時点の内容をステージします。以後編集した場合は再度差分を確認し、必要なファイルを追加します。まとめてgit add .にせず、今回は対象を指定しました。Git公式のadd解説

手元のテスト成功と、ステージした内容の成功を区別する

git addの後で実装を直すと、手元のテストは成功しても、コミット予定の内容には修正前のコードが残ることがあります。git status --shortのMMは、同じファイルにステージ済みと未ステージの変更が両方ある状態です。片方の差分だけで判断しません。

この教材の2ファイルについては、ステージした内容だけを別の一時フォルダーへ取り出して確認できます。上のgit add total.py test_total.pyを終えた練習リポジトリで実行してください。

staged_review_dir=$(mktemp -d /tmp/staged-review.XXXXXX) || exit 1
git show :total.py > "$staged_review_dir/total.py" || exit 1
git show :test_total.py > "$staged_review_dir/test_total.py" || exit 1
(cd "$staged_review_dir" && python3 -m unittest -v)

修正後の内容をステージできていれば、こちらでも3件が合格します。実装がまだ「負数なら0」のままステージされていると、負数で例外を期待するテストが失敗します。編集時には、手元では3件合格しても、古い実装を残したステージの検査だけが失敗する状態も再現しました。

失敗したら、git diffとgit diff --cachedを読み直し、必要な修正を対象ファイル名でステージしてから確認し直します。git diff --cached --checkの成功は、この仕様違反を見つける代わりにはなりません。

この抽出で検査できるのは、標準ライブラリだけで動く教材の2ファイルです。実プロジェクトでは設定・依存ファイル・生成物も必要なので、同じ2ファイルのコピーだけでコミット全体を検証済みとは扱わず、プロジェクトのCIで対象コミットを確認します。

最終差分を読み、目的・テスト・保留事項を説明できたらコミットできます。

git commit -m "Reject negative prices and test totals"

保留したメモは未追跡のまま残ります。不要かどうかは別途判断し、作業を消すコマンドで一括処理しません。既存プロジェクトで問題が起きた場合も、まず現状と履歴を保存して担当者と戻す範囲を決めます。

秘密情報とテストの限界

実務では変更一覧から.env、鍵、設定、ログ、依存関係やCIの変更も確認します。差分だけでなく、新規ファイルも開いてください。実際のキーや個人情報をAIやレビュー用ログへ貼り付けず、サンプル値に置き換えます。漏えいがあれば削除だけで済ませず、認証情報の失効・再発行を担当者へ依頼します。

文字列検索やテストが通っても、秘密情報や仕様漏れがない証明にはなりません。今回確認したのは整数リストの3ケースとGitの状態遷移です。大規模な呼び出し元への影響やClaude Codeの動作は確認していません。

次に試すこと

導入から確認する場合はClaude Code導入チェックリスト、プロジェクトの前提と実行コマンドを揃える場合はCLAUDE.mdの最小構成へ進んでください。

今回の例を終えたら、[0]と[-1]のテストを自分で足し、変更をステージする前後で差分を比較します。テストの作り方はClaude Codeのテスト生成で確認できます。期待値を仕様から決め、テスト成功と採用判断を分けるところまでが演習です。

出典・検証環境

公式情報の確認日:2026年11月13日(差分・ステージ確認の資料を再確認)。

検証環境:Git 2.50.1(Apple Git-155)、Python 3.14.2。外部パッケージなし、隔離した一時リポジトリで実行しました。

2026年11月13日の追加検証:git version 2.50.1 (Apple Git-155)、Python 3.9.7 / macOS。手元で3件合格・古いステージで負数テスト失敗・再ステージ後3件合格を確認しました。

コメント

タイトルとURLをコピーしました