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公式:git diff
- Git公式:git status
- Git公式:git add
- Git公式:git show:ステージした教材ファイルの取り出し。
検証環境: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件合格を確認しました。


コメント