Claude Media
Claude Code diffコマンドの使い方と差分ビューアー操作

Claude Code diffコマンドの使い方と差分ビューアー操作

/diffは端末の幅や表示モードで、横に開くパネルと画面を置き換えるビューアーのどちらかに切り替わります。開く条件、ターン差分に出ない変更、textconvが効かない仕様を実機のgit出力つきで示します。

/diffを実行したとき、画面の右に差分パネルが開くか、プロンプトの上にダイアログが開くかは、表示モードと端末の幅で決まります。どちらが出ても、コミット前の変更とClaude Codeが加えた編集を確認できる点は同じです。差分はrawなgit blobから計算されるため、textconvや差分ドライバーが効かないことにも注意が必要です(v2.1.222以降)。Claudeが提案する変更の差分をIDE側に出すかどうかは、別のdiffTool設定が決めます。/diffの表示先は変わりません。

/diffを打つと何が開くか

引数はありません。Claude Codeのセッション内でそのまま実行します。

/diff

開く画面は表示モード(全画面表示か従来の表示か)で2種類に分かれます。

くらべる

差分パネルと差分ビューアー

全画面表示

差分パネル

会話の横に開いたままになり、Claudeがファイルを編集するかシェルコマンドを実行するたびに更新されます。

従来の表示

差分ビューアー

プロンプトの上に枠付きのブロックとして開きます。Tabでsourceピッカーに移り、上下キーとEnterでCurrent表示とターンごとの表示を切り替えます。sourceピッカーはClaudeがファイルを編集したあとに出ます。cc-plugin-diffを/pluginで無効化した場合の旧ビューアーでは、左右キーで切り替えます。

パネルだけを扱う記事としてdiffパネルの使い方もあります。パネルを開くには、全画面表示、gitリポジトリ、幅110列以上の端末、v2.1.287以降の4つがそろう必要があります。パネル自体はv2.1.260で入りましたが、今の動作条件はv2.1.287以降です。条件を満たさないときは、ビューアーが開くか、開けない理由が表示されます。

パネルは、Claudeがファイルを編集し始めたときに自動で開くこともあります。端末が144列以上なら開き、自分で一度/diffで開いた後は、収まる幅の端末なら次のセッション以降もファイル編集と同時に開きます。閉じるとそのまま閉じた状態が続き、再び/diffを実行するまで開きません。

差分パネルでできること

パネルにはファイルごとの追加・削除行数が並び、選んだファイルの差分が一覧の下に出ます。閉じるには、もう一度/diffを実行するか、ヘッダーの✕を押します。

  • ファイル行をクリックすると、そのファイルへ移動します。ファイル一覧が長いときはMeta+Up/Meta+DownかCtrl+Up/Ctrl+Downでスクロールします
  • 差分の行をマウスで選ぶと、その選択が次のプロンプトに添付され、入力欄に行数が出ます。「この関数だけ直して」のように範囲を指して依頼できます。選択なしで送るには、行数表示の直後にカーソルを置いてBackspaceを押します(v2.1.271以降)
  • テストファイルと生成ファイルは一覧から除かれ、セッション前の変更は下部の1行にまとまります。どちらもその行をクリックすると展開できます
  • Ctrl+X Bで比較の基準を切り替えます。このセッションの変更、コミット前の変更すべて、デフォルトブランチから分岐した後のすべての変更の順に循環し、選択はプロジェクトごとに記憶されます

既定でキーが割り当てられていないパネル操作

パネル用のアクションは6つあり、そのうち3つは既定でキーが未割当です。/diffと同じ開閉、テストファイルと生成ファイルの表示切り替え、セッション前の変更の展開・折りたたみが該当し、キーで操作したいときは自分で割り当てます。

アクション既定内容
app:toggleReplTab既定未割当内容パネルを開閉する(/diffと同じ)
app:toggleDiffNoiseFilter既定未割当内容テストファイルと生成ファイルの表示を切り替える
app:toggleDiffPreSession既定未割当内容セッション前の変更を展開・折りたたむ
app:cycleDiffBase既定Ctrl+X B内容比較の基準を循環する

app:cycleDiffBaseはDiffPanel文脈で、ほかはGlobal文脈で動きます。パネルを開くキーを1つ足すなら、keybindings.jsonに次のように書きます。キーの組み合わせは一例で、手元の割り当てと重ならないものを選びます。

{
  "bindings": [
    {
      "context": "Global",
      "bindings": {
        "ctrl+x d": "app:toggleReplTab"
      }
    }
  ]
}

ファイル一覧のスクロールにもapp:diffFileListUpとapp:diffFileListDownがあり、既定は前述のCtrl+Up/Ctrl+DownとMeta+Up/Meta+Downです。

差分ビューアーの操作とキー

ビューアーはDiffDialogというキーバインド用の文脈で動きます。Current表示は、コミット前の変更をgitから読んだものです。コミット前の変更が1つもないときは、デフォルトブランチに対してブランチが加えた内容が出ます。

もう一方がターンごとの表示です。Claudeがファイルを編集した各プロンプトについて、そのときの編集だけを見せます。

操作キー内容
ソースの切り替えキー左 / 右内容Currentとターンごとの表示を移動
ファイルの選択キー上・K / 下・J内容一覧で移動、詳細では1行スクロール
詳細を開くキーEnter内容選択したファイルの差分を表示
半画面スクロールキーPageUp / PageDown内容詳細ビューで半画面分
1画面スクロールキーSpace / Shift+Space・B内容詳細ビューで1画面分(Spaceが下、Shift+SpaceかBが上)
先頭・末尾キーG・Home / Shift+G・End内容詳細ビューで端へ移動
閉じる・戻るキーEsc内容詳細から一覧へ、一覧から閉じる

ファイル一覧の移動はv2.1.283以降、他の一覧と同じselect:*アクションで動きます。以前のdiff:*の再割り当ては引き続き有効です。ファイル一覧の移動先だけを変えたいときは、keybindings.jsonのDiffDialogブロックにselect:previousやselect:nextを書きます。

「Claudeが変えた」のにターン差分に出ないもの

ターンごとの表示は、gitではなくClaudeのファイル編集から作られます。シェルコマンドで生じた変更は、Currentにしか現れません。

たとえばsed -iで書き換えたファイルや、コマンドが生成したファイルは、どのターンにも載りません。「このターンで何が変わったか」を追っていて変更が見当たらないときは、Currentに切り替えると見つかります。

同じ考え方で、Currentが読むgitの差分では、サブモジュールは1つの項目として扱われます。表示されるのは、指しているコミットが変わったときだけです。サブモジュール内のファイル編集は、この一覧には出ません。

textconvが効かない仕様を手元で確かめる

v2.1.222で/diff、Remote Controlのワークスペース差分、Claude Code on the webのファイル編集差分が、rawなgit blobを基準にする形に変わりました。ワークスペースに設定された差分ドライバーとtextconvは無視されます。その前は、リポジトリ側の設定が/diffの表示に影響することがありました。

textconvはgitの設定項目で、差分を出す直前にファイルの内容をテキストに変換します。この変換を通るgit diffと、通らない差分が、どれだけ違って見えるかを試せます。次の手順は、/diffそのものではなく、素のgitで再現するものです。

手順

textconvの有無で差分がどう変わるか

  1. 1

    作業用のリポジトリを作る

    .txtファイルに、大文字へ変換するtextconvを割り当てます。

  2. 2

    ファイルを変更する

    worldをclaudeに書き換えます。コミットはしません。

  3. 3

    2通りの差分を見比べる

    git diffとgit diff --no-textconvを実行します。

git init -q . && git config diff.upper.textconv "tr a-z A-Z <"
echo '*.txt diff=upper' > .gitattributes
printf 'hello\nworld\n' > note.txt && git add . && git commit -qm init
printf 'hello\nclaude\n' > note.txt
git diff
git diff --no-textconv

git 2.50.1で実行した結果は次のとおりです。フィルタを通したgit diffは内容が大文字に変換されて出ます。

@@ -1,2 +1,2 @@
 HELLO
-WORLD
+CLAUDE

--no-textconvを付けると、ファイルの実際の中身が出ます。

@@ -1,2 +1,2 @@
 hello
-world
+claude

v2.1.222以降の/diffが出すのは、後者のraw blob側の差分です。git diffの出力と食い違って見えたら、git diff --no-textconvと比べると原因を切り分けられます。

Word文書のようなバイナリをtextconvで読める形にしているリポジトリでは、/diffではその変換後の内容は読めません。変換後の内容を確認したいときは、端末でgit diffを実行します。

なお、v2.1.265ではClaude Code自身が実行するgitのstatusとdiffの確認処理が、作業ツリー内のネストしたリポジトリに設定されたcleanフィルタを実行しないよう修正されています。

いつからその挙動なのか

/diffまわりの変更は、次の順で入りました。古いバージョンを使っている環境でつまずいたときの手がかりになります。

あゆみ

/diffの主な変更

  1. v2.1.149詳細ビューのキー操作

    詳細ビューをキーボードでスクロールできるようになりました(矢印、j/k、PgUp/PgDn、Space、Home/End)。

  2. v2.1.198表示の自動更新

    ブランチの切り替えや、セッション外でのコミットの後に、表示が更新されるよう修正されました。それ以前は、表示が更新されないことがありました。同じバージョンにはバックグラウンドエージェントの自走の強化も入っています。

  3. v2.1.203左キーの廃止

    バックグラウンドタスク・差分・ワークフロー詳細の各ビューで、左キーが閉じる操作でなくなりました。戻る操作はEscに統一されています。

  4. v2.1.222raw blob基準

    rawなgit blobが基準になり、textconvと差分ドライバーが無視されるようになりました。詳しくはv2.1.222の解説にあります。

  5. v2.1.260差分パネル

    全画面表示で、会話の横に開く差分パネルが追加されました。

  6. v2.1.267 / v2.1.269パネルの初期表示

    v2.1.267で、パネルが「0 files changed」とスピナーを一瞬出してから落ち着く挙動が直り、空の状態がパネルの中央に置かれました。v2.1.269では、読み込み中の状態を挟まず、最初から描画済みの状態で開くようになりました。

  7. v2.1.268選択の表示位置

    エディターや/diffで選んだ範囲が、プロンプトの入力欄の中に表示されるようになりました。

  8. v2.1.281長い一覧の見通し

    変更ファイルの一覧が長いときにスクロールバーで現在位置が分かり、長いパスが行内で折り返されなくなりました。

  9. v2.1.283一覧の操作を共通化

    /diffと/rewindの一覧が、他の一覧と同じselect:*アクションで動くようになりました。

/code-reviewとの使い分け

/diffは変更を見せるだけで、良し悪しの判定はしません。バグの指摘や整理の提案が必要なときは/code-review(エイリアス/review)を使います。

観点/diff/code-review
役割/diff差分を表示する/code-review現在の差分、またはPR・ブランチ・パスを指定して、正しさの問題を指摘する
出力/diffパネルまたはビューアー/code-review指摘のレポート(--fixで適用も可能)
向いている場面/diffマージ前に何が変わったかを見たいとき/code-review正しさをチェックしたいとき

コマンド全体の役割はスラッシュコマンド一覧にあります。

まとめ

Claudeの作業を横で見続けたいなら全画面表示と110列以上の端末、コミット前に全体を読み通したいならビューアーのCurrent、ターン単位で追いたいならビューアーのターン表示、と使い分けられます。パネルを頻繁に開閉するなら、未割当のapp:toggleReplTabにキーを足す手もあります。変換後の中身を見たいときだけ、端末のgit diffに戻ります。

この記事を共有:XはてブLinkedIn