
AIリファクタリングの差分レビュー|壊さず確認する手順
「ここ、読みづらいからきれいにしておいて」——AIにそう頼んだら、返ってきた差分が思ったより広い。 変数名が変わり、関数が分かれ、ついでに条件分岐の形まで変わっている。「整理はされたっぽいけど、これ、動きは前と同じなんだっけ?」——マージしようとした手が、最後にふっと止まる。そんな夕方、ありますよね。
リファクタリングは本来、外から見た振る舞いは変えずに、中身の構造だけを整える作業です。 ところがAIに任せると、整理のついでに「ちょっとした挙動の変化」がこっそり混じることがあります。しかも見た目がきれいになっているぶん、差分を読んでいても気づきにくい。きれいなコードほど、目が滑るのです。
この記事は、AIにリファクタを任せたあと、差分から「混じってしまった振る舞いの変化」を見抜く確認手順をまとめたものです。大がかりなレビュー体制の話ではありません。いまは Claude Code・Cursor・GitHub Copilot のようなエージェントが差分やプルリクを出し、テストまで自分で走らせてくれます。だからこそ人の仕事は、その差分ビューやPRの上で「振る舞いが保たれているか」を承認・指摘することに移っています。マージ前の数分〜十数分でできる、地に足のついた差分の読み方です。一度に全部やる必要はありません。まず効く所から、一緒に見ていきましょう。
結論:AIのリファクタ差分は「きれいになったか」ではなく「振る舞いが変わっていないか」を軸に確認します。順番は、①変える/変えない範囲を先に1行で決める → ②差分を小さく刻んでレビューできる単位にする → ③差分の中の“ロジックの変化”だけを拾って読む → ④リファクタ前後で同じテストが緑のままかで固定する → ⑤こわい所だけ実際に動かして突き合わせる。AIは「整理」と「仕様変更」を一緒にやってしまうことがあるので、その2つを差分の上で切り分けるのが人の仕事です。最後に「差分レビューメモ」のテンプレとチェックリストを置きました。
きれいにすることと、同じ動きを保つこと。 リファクタの差分レビューは、この2つが両立しているかを静かに確かめる作業です。
なぜAIのリファクタ差分は「読みにくい」のか

AIにリファクタを頼んだときの差分が読みにくいのには、はっきりした理由があります。 それは、「整えるだけの変更」と「振る舞いが変わる変更」が、同じ差分の中に混ざって出てくるからです。
たとえば、こんな変更が一度に返ってきます。
- 変数名・関数名をわかりやすく付け替えた(振る舞いは同じ)
- 長い関数を小さく分割した(振る舞いは同じ……のはず)
- 重複した処理を1か所にまとめた(まとめ方しだいで挙動が変わることがある)
- 条件分岐を「簡潔に」書き直した(境界やエラー処理がこっそり変わることがある)
- ついでに「ここはこうした方がいい」と仕様まで気を利かせて変えた(これは本来別の作業)
前半の名前付け替えや分割は、基本的に安全な整理です。 こわいのは後半です。AIは「もっと良くしよう」と気を利かせて、頼んでいない挙動の変更まで一緒に入れてくることがあります。デフォルト値が変わる、null のときの扱いが変わる、丸めの方向が変わる、例外を握りつぶす形になる——どれも差分の上では一行の小さな違いで、きれいな見た目に紛れて目を通り抜けます。
だから差分レビューのコツは、全部を平等に読まないことです。 名前付け替えのような安全な変更はさっと流し、振る舞いが変わりうる所だけに目を集める。次の章から、その絞り込み方を手順にして見ていきます。
差分レビューの型:5つの手順
先に全体像を出します。上から順に、マージ前になぞれる流れです。
| 手順 | 何をするか | これで防げること |
|---|---|---|
| ①範囲を1行で決める | 変える所・変えない所を先に固定 | 「ついでの仕様変更」の紛れ込み |
| ②差分を小さく刻む | レビューできる単位に分割 | 大量diffで目が滑る |
| ③ロジックの変化を拾う | 振る舞いが変わる行だけ読む | 条件・既定値・例外の静かな変化 |
| ④テストで固定する | 前後で同じテストが緑か | 仕様の取り違え・回帰 |
| ⑤こわい所を動かす | 実データで前後を突き合わせ | 読むだけでは拾えないズレ |
ポイントは、5つ全部を毎回フルでやらないことです。 名前を整えるだけの小さなリファクタなら①②と④だけ、業務ロジックに踏み込むなら③⑤が要、というように、その変更で一番こわい所を選んでなぞれば十分です。全部やろうとすると続きません。続かない型は、型として失敗です。
締め切り直前の「3分版」最小セット:今日はとにかく時間がない、それでもマージしたい——そんな日は、これだけで構いません。①変える/変えない範囲を1行で決める + ③こわいロジックの行(条件・既定値・例外)だけ拾って読む + ⑤こわい1件を前後で突き合わせる。テストや刻みが間に合わなくても、この3つを通せば「振る舞いが変わっていないか」の芯は押さえられます。残りは余裕のある日に足せば十分です。
では一つずつ見ていきます。
手順1:変える所・変えない所を、先に1行で決める
差分を読み始める前に、まず「今回のリファクタで、何を変えて、何を変えないか」を自分の言葉で1行に決めます。AIに頼む前でも、頼んだ後でも構いません。先に基準があると、差分の良し悪しを判断できます。
決めておきたいこと:
- 変えていい所:名前、関数の分け方、コメント、重複の整理 など「中身の構造」
- 変えてはいけない所:入力に対する出力、エラーの出し方、外部に見える振る舞い
- 今回は触らない所:ついでに直したくなる箇所(別のコミットに分ける)
ここで効くのは、AIに頼むときに「振る舞いは変えずに、読みやすさだけ直して。仕様は変えないで」と一言添えることです。 それでも気を利かせて変えてくることはありますが、基準が先にあれば、差分を見て「これは頼んでいない変更だ」とすぐ気づけます。基準がないと、きれいになった差分を前に「まあ、良くなってるからいいか」で流してしまいます。何を守るかを先に決めておくのが、最初の安全装置です。
手順2:差分を小さく刻んで、レビューできる単位にする
範囲が決まったら、次は差分そのものを小さくします。一度に何百行もの差分を渡されると、人はどんなに気をつけても目が滑ります。AIのリファクタが危ういのは、まさにこの「大量diff」になりやすいからです。
やること:
- エージェントに頼むときから「1つの目的につき1コミット・1PR」で小さく出させる(名前の整理と関数分割を別々に頼む、など)
- すでに大きな差分・PRになっているなら、差分ビューをファイル単位・関数単位で分けて読む
- 「名前の付け替えだけ」のコミットと「ロジックを触るコミット」を分ける——これだけでレビューがぐっと楽になる
ただ、AIは頼んでも素直に刻んでくれるとは限らず、現場では最初から大きな差分が届くこともよくあります。刻み直しを頼んでも間に合わないなら、無理に分け直さなくて構いません。大きなdiffが先に来てしまったら、自分でロジックを触る行だけを拾って読む手順3に飛んでしまってよいです。刻むのはあくまで読みやすくするための手段で、目的は危ない一行を見落とさないこと。手段が使えない日は、目的だけ直接取りにいけば十分です。
ここでの狙いは、安全な変更と危ない変更をコミットやPRの単位で分けてしまうことです。 名前の付け替えだけのコミットなら、差分ビューの目視はさっと流せます。ロジックを触るコミットだけに集中して時間を使える。混ざったままだと、安全な変更の山に危ない一行が埋もれて見えなくなります。「小さく刻む」は、レビューの質をいちばん安く上げる一手です。
手順3:差分の中の“ロジックの変化”だけを拾って読む

ここが差分レビューの中心です。 名前の付け替えのような安全な変更はさっと流し、「これは振る舞いが変わるかもしれない」という行だけに目を集めます。リファクタの事故は、たいていこの種類の行に潜んでいます。
特に目を止めたい変化:
- 条件分岐の書き換え:
ifの条件、&&/||の組み替え、>と>=の入れ替わり(境界が1ずれる) - 既定値・初期値の変化:引数のデフォルト、
null/空のときに何を返すか - エラー処理の変化:
try/catchの範囲、例外を投げる→握りつぶす、ログの有無 - ループや早期returnの変化:抜けるタイミング、処理する件数、順序
- まとめた重複の差:「同じに見えてわずかに違った処理」を1つにまとめていないか
- 暗黙の変換:型のキャスト、丸め、文字コード、タイムゾーンの扱い
読むときのコツは、「この一行で、同じ入力に対する出力が変わる可能性があるか?」と一行ずつ問うことです。 変わらないと言い切れる行(名前付け替えなど)はスキップ。少しでも「変わるかも」と思った行は、変更前と変更後を声に出して読み比べる。AIは「簡潔で良さそうな書き方」を選ぶので、簡潔さと引き換えに境界やエラー処理がずれることがあります。簡潔になった所ほど、よく見るくらいでちょうどいいです。
手順4:リファクタ前後で「同じテストが緑のまま」かで固定する
差分を目で読んだら、次はテストで裏を取ります。リファクタの確認に、テストはとても相性がいい道具です。 なぜなら、リファクタは「振る舞いを変えない」作業なので、リファクタの前に通っていたテストは、後でも全部そのまま緑であるはずだから。
先に免除ルートを置いておきます。 そもそもテストが無い・薄いレガシーが多い現場では、「前に緑にしておく」が一番の壁になります。テストが書けない/間に合わないときは、この手順をまるごと飛ばして、次の手順5の「前後の突き合わせ(同じ入力→同じ出力)」を1〜2件やれば代替として十分です。テストは確認の手段のひとつであって、それ自体が目的ではありません。手段が用意できない日は、突き合わせで同じところを守れば構いません。テストが書ける・あるなら、以下を続けてください。
やること:
- リファクタ前のコードで、テストを一度緑にしておく(先に通しておくのが大事)
- リファクタ後に同じテストを実行し、全部そのまま緑かを見る
- テストを書き換える必要が出たら要注意——「振る舞いが変わった」サインかもしれない
- テストが薄い部分は、リファクタ前の振る舞いを写し取る簡単なテスト(特性テスト)を1〜2本足してから着手する(それも間に合わなければ、無理せず手順5の突き合わせで代える)
ここで一番大事なのは、「リファクタに合わせてテストを直す」を安易にやらないことです。 テストが落ちたとき、コードを疑わずにテストを直してしまうと、振る舞いの変化を自分で承認してしまいます。テストが落ちたら、まず「これはバグか、それとも意図した変更か」を立ち止まって考える。意図した仕様変更なら、それはもうリファクタではなく別の作業——コミットを分けて、わかるように記録します。テストとAIが同じ思い込みを共有しないよう、テストはリファクタ前の振る舞いを基準にしておくのがコツです。
手順5:こわい所だけ、実際に動かして前後を突き合わせる
テストでも拾いきれない所は、最後に手を動かして確かめます。テストが薄い箇所や、外部とやり取りする箇所は、読むだけ・テストだけでは安心しきれません。
やること:
- 同じ入力を、リファクタ前と後の両方に通して、出力が一致するかを見る(1〜2件でいい)
- 業務的にこわい1件(金額の計算、件数の集計、日付の処理など)を選んで突き合わせる
- 副作用のある処理(ファイル・DB・外部API)は、コピーや使い捨て環境で前後の動きを比べる
- 検証環境やDBコピーをすぐ用意できないなら、無理に作らなくてよい。 その場合の最低ラインは、読み(手順3)と特性テストで「こわい1件」に絞って確かめること。全経路を動かせなくても、一番こわい1件を守れれば前進です
ここで効くのは、抽象的に「動いた」で済ませず、前後で同じ結果になることを具体的な値で確かめることです。 たとえば「2026-01-15 の集計が 1,200 円」という確定した1件を、前のコードと後のコードの両方に通して、ぴったり一致するかを見る。一致すれば、その経路の振る舞いは保たれています。実際に動かす確認の型は、AI生成コードの動作確認に詳しくまとめてあるので、あわせてどうぞ。読む確認と動かす確認は、別々の網で別々の穴を拾います。
ありがちな落とし穴と、その回避
差分レビューでつまずきやすい所を、先に潰しておきます。
- きれいになったことに満足してマージする:見た目の改善と、振る舞いの維持は別物。「読みやすい」と「同じ動き」を分けて確認する。
- 大量の差分を一気に読む:人は必ず目が滑ります。名前の整理とロジックの変更は、コミットを分けてから読む。
- 落ちたテストを反射的に直す:テストが落ちたら、まず「バグか、意図した変更か」を考える。直す前に立ち止まる。
- 「ついでの仕様変更」を見逃す:AIは気を利かせて挙動を変えることがあります。頼んでいない変更は、別のコミットに切り出す。
- テストがない所をテストなしでリファクタする:先に振る舞いを写し取る簡単なテストを足してから着手すると、安心して整理できます。
落とし穴の多くは、「きれいになった=正しくなった」と感じてしまうことから来ます。 差分レビューは、AIの整理を疑う作業ではなく、自分が安心してマージするための作業です。最後の数分を、自分のために使いましょう。
明日からやること(小さく始める3つ)
全部を一度に習慣化しようとすると続きません。まずこの3つから。
- AIに頼むとき「振る舞いは変えずに、読みやすさだけ」と一言添える:手順1が片付き、ついでの仕様変更がぐっと減ります。
- 「名前の整理」と「ロジックの変更」をコミットで分ける:手順2の効果が大きく、危ない一行が安全な変更に埋もれなくなります。
- リファクタ前にテストを緑にしてから着手する:手順4の土台ができ、「前後で同じ緑か」だけで多くの回帰を拾えます(テストが無い・間に合わない現場は、代わりに手順5の前後突き合わせを1件だけでもどうぞ)。
この3つだけでも、「きれいになったから大丈夫」が「振る舞いを保てたから大丈夫」に変わります。 慣れてきたら、ロジックの変化を拾う読み方(手順3)や、こわい所の前後突き合わせ(手順5)も足していけば十分です。
コピーして使う「差分レビューメモ」
AIにリファクタを任せたら、関係する行だけ埋めて手元に置いてください。手元のメモとして使ってもいいですし、エージェントが出したPRの差分ビュー上で、そのまま「ここを見る観点リスト」としてなぞるのにも使えます。PRの説明欄やレビューコメントに貼って確認の足場にしても構いません。全部やる必要はなく、その変更でこわい所だけで十分です。
# 差分レビューメモ
## ①範囲
- 変えていい所(名前・分割・整理など):
- 変えてはいけない所(振る舞い):
- 今回は触らない所:
## ②刻み
- コミットは目的ごとに分かれているか:
- 名前整理とロジック変更は別か:
## ③ロジックの変化
- 条件分岐・境界(>と>=など)の変化:
- 既定値・null/空のときの扱いの変化:
- エラー処理・例外・ログの変化:
- まとめた重複に隠れた差はないか:
## ④テスト
- リファクタ前に緑にしたか:
- 後も同じテストが全部緑か:
- 書き換えが必要になったテスト(=要注意):
## ⑤前後の突き合わせ
- 同じ入力で前後の出力が一致したか(具体値):
- 副作用はコピー環境で比べたか:
差分レビューチェックリスト
マージやプルリクの前に、1項目ずつ「○/要確認」を付けながら使ってください。一度に全部でなく、今日はその変更に関係する所だけで十分です。各セクションの ★印は「これだけは外せない最低ライン」。忙しい日は★だけ、残りは任意——と読んでください。
①範囲を決める
- ★ 変える所・変えない所を1行で決めたか
- AIに「振る舞いは変えない」と伝えたか
②小さく刻む
- コミットは目的ごとに分かれているか
- 名前整理とロジック変更を分けたか(大きなdiffが先に来たら無理に分けず③へ飛んでよい)
③ロジックの変化を拾う
- ★ 条件・境界(>と>=)の変化を見たか
- 既定値・null/空の扱いの変化を見たか
- エラー処理・例外・ログの変化を見たか
④テストで固定する(テストが無ければ前後突き合わせ=⑤で代替可)
- ★ リファクタ前にテストを緑にしたか/無ければ⑤の突き合わせで代えたか
- 後も同じテストが全部緑か確認したか
- 書き換えが要るテストの理由を確かめたか
⑤こわい所を動かす
- ★ 同じ入力で前後の出力が一致したか(こわい1件でよい)
- 副作用はコピー環境で比べたか(用意できなければ読みと特性テストで1件に絞る)
最後に
AIにリファクタを任せて差分を読み直すのは、AIを信用していないからではありません。 最後にマージするのが自分だから、振る舞いが保たれているかを自分の目で一度確かめておく——それだけのことです。
きれいに整ったコードは、それだけで気持ちのいいものです。 そこに「動きも前と同じ」という確かさが加わると、リファクタはようやく安心して使える道具になります。読んで確かめるレビュー・検証チェックリストや、AIに任せる前に渡す前提と制約の伝え方とあわせて使うと、AIコーディングはぐっと落ち着きます。

5つの手順のうち、今日できたのが1つでも、それはもう「きれいさだけで通さなかった」という確かな一歩です。 マージ前のあと数分を、未来の自分のために使っていきましょう。