Claude Media
Claude Codeのresumeとforkの違い — 再開か複製か

Claude Codeのresumeとforkの違い — 再開か複製か

Claude Codeのセッション再開(resume)とフォーク(fork-session/branch)は何が引き継がれ何が独立するかが違います。仕様の違いと使い分けを示します。

Claude Codeのresumeとforkは何が違うか

claude --continueclaude --resumeで行う再開(resume)は、同じセッションIDのまま会話に新しいメッセージを積み重ねます。一方--fork-session/branchで行うフォーク(fork)は、そこまでの会話を新しいセッションIDへコピーし、元のセッションはコピーが作られた時点のまま手つかずで残ります。

公式ドキュメントの「How Claude Code works」は、この2つを対の概念として説明しています。再開は同じ会話の続きを書く操作、フォークは会話の分岐点を作る操作、というのが最も短い定義です。どちらも会話を失わない点は同じですが、「1本の会話を伸ばす」か「1本の会話を2本に分ける」かで性質がまったく違います。

本記事はresumeとforkの正面比較(何が引き継がれ何が独立するか)に絞ります。/branch単体の操作手順やチェックポイントとの違いはセッションブランチの記事/branchコマンド自体の詳細仕様はClaude Code branchコマンドの記事にまとめています。

そもそも新規セッションでは何が失われるか

resumeとforkの違いを理解する前提として、何もしなければセッションは互いに独立しているという前提を押さえておく必要があります。Claude Codeは各セッションを個別に保存し、新しいセッションは前のセッションの会話履歴を一切持たない状態で始まります。学習内容を引き継ぎたい場合はauto memoryかCLAUDE.mdへの明示的な記述に頼ることになり、会話そのものは自動では引き継がれません。

resumeとforkは、この「セッションは独立している」という既定の挙動に対して、それぞれ別の形で例外を作る仕組みです。resumeは同じセッションIDへ戻ることで独立性そのものを解除し、forkは独立した新しいIDを作りながらも起点となる会話だけはコピーで持ち込みます。真っさらな新規セッション・resume・forkの3つを並べると、「履歴を持つか」「IDが同じか」の2軸で整理できる、と考えると位置づけが掴みやすくなります。

resumeが引き継ぐもの

claude --resume/resumeのピッカーで選んだセッションは、会話履歴だけでなく終了時点の状態ごと復元します。モデル・エージェント設定・権限モード・アクティブなgoal・期限切れでないスケジュール済みタスクまでが対象です。復元されない代表例は--mcp-config--settingsのような起動時フラグで、依存していたセッションでは再開時に渡し直す必要があります。復元される項目・されない項目の全リストと権限モードの復元条件は/resumeコマンドの記事にまとめています。

--continue--resumeもどちらも再開ですが、探す範囲が違います。--continueは現在のディレクトリの直近セッションを問答無用で開き、--resumeはセッションピッカーを開いて選ばせます。名前を指定した--resume <name>は完全一致すれば直接再開し、あいまいな場合はピッカーに名前を検索語として入れた状態で開きます。

forkが複製するもの・独立させるもの

/branch(またはCLIの--fork-session)を実行すると、その時点までの会話履歴が新しいセッションIDにコピーされ、実行後は自動的にコピー側へ切り替わります。元のセッションは変更されずディスク上に残り、/resume <元の名前>でいつでも戻れます。

コピーが何を引き継ぎ、何が独立するかは項目によって違います。

状態フォーク後どうなるか
会話履歴フォーク後どうなるか/branch実行時点までコピーされる
セッション内で得た「今回は聞かない」権限フォーク後どうなるか同じプロセス内で分岐する/branchは引き継ぐ。別プロセスに分かれる--fork-sessionは引き継がず再承認が必要
実行中のバックグラウンドサブエージェント・バックグラウンドBashフォーク後どうなるか動き続ける。出力は切り替え後の新しいセッション側に表示され、元のセッションには出ない
Remote Control接続フォーク後どうなるか接続を保ったままフォーク後のセッションに追従する

会話を分岐だけしたいのか、コピー側で実際に作業を続けたいのかで、この表の意味が変わります。フォークは今の会話を枝分かれさせて枝の側に自分が乗り移る操作で、乗り移った後は元の幹に何が起きても気づけません。分岐後の状態はセッションブランチの記事の「ブランチ後に何が引き継がれ、何が引き継がれないか」でも別角度から扱っています。

resumeとforkの使い分け早見表

したいこと使うコマンド理由
中断した会話の続きを書きたい使うコマンドclaude --continue / claude --resume理由同じセッションIDのまま履歴に追記される
別のアプローチを試すが、元の会話にも戻れるようにしたい使うコマンド/branch理由コピー側で試し、ダメなら/resumeで元に戻る
起動時フラグ(--mcp-config等)を変えて同じ会話を続けたい使うコマンド--continueまたは--resume+ フラグを渡し直す理由フラグは再開時に再指定が必要なため
今の会話を止めずに副次タスクだけ別セッションへ任せたい使うコマンド/fork(このページの対象外。別コマンド)理由自分は元の会話に残ったまま、コピー側が裏で動く

長時間放置した会話を再開するときだけ起きること

Pro・Maxプランで、1時間以上操作していない、かつトークン数が10万を超えるセッションを--resume--continueで開くと、Claude Codeは会話を復元したあとに「要約から続けるか、全履歴のまま続けるか」を選ぶダイアログを出します。プロンプトキャッシュがすでに失効しているため、どちらを選んでも次のリクエストは一度全履歴を処理し直します。

このダイアログはresume固有の挙動です。/branchは今アクティブな会話の途中で実行するコマンドなので、「1時間以上操作していない」という発火条件そのものに当てはまりません。フォークした直後のコピー側は元の会話のキャッシュをそのまま引き継ぎ、resumeのように長時間放置後の再処理が発生しない点が、resumeとforkの体感速度の違いとして表れます。

resumeとforkに関わる仕様変更の流れ

セッションの命名・検索まわりの挙動は、resumeとforkの両方に影響する形で複数バージョンにまたがって整備されてきました。

バージョン変更内容影響する側
v2.1.198変更内容コンパクション後に/branchを名前なしで実行しても、コンパクション前の元のプロンプトから名前が付くようになった影響する側fork
v2.1.211変更内容最初のプロンプトが/loopのセッションがclaude --continueとピッカーから恒久的に隠れる不具合を修正影響する側resume
v2.1.223変更内容claude --resume <session-id>のクロスプロジェクト検索が、現在のプロジェクトとそのワークツリーを超えてマシン上の他プロジェクトまで及ぶようになった影響する側resume
v2.1.232変更内容セッション名が重複したとき、先に使っていたセッションの名前を優先し、新しい方だけ自動でリネームするようになった影響する側resume・fork共通(命名の仕組みを共有するため)

v2.1.223のクロスプロジェクト検索拡張は、/cdで作業ディレクトリを移動したり複数リポジトリを横断したりする運用でresumeの実用性を大きく上げましたが、forkで作った新しいセッションIDにも同じ検索ロジックが適用されます。claude --resume <session-id>はどのディレクトリからでも実行でき、まず現在のプロジェクトとそのワークツリーを検索し、見つからなければマシン上の他プロジェクトを検索します。この拡張が入る前は、セッションが最後に作業していたディレクトリまで戻らないと再開できませんでした。

フォークしたセッションはピッカーにどう並ぶか

/branch--fork-sessionで作ったセッションは、コピー元とは別のセッションIDを持つため、/resumeのピッカーには独立した行として並びます。同じ会話に由来する複数のエントリをピッカーが見つけた場合はまとめて1行にグループ化され、キーで展開すると内訳が見えます。フォークを繰り返して同じ起点から複数のコピーを作った場合、ピッカー上では「グループを展開すると枝分かれの候補がずらりと並ぶ」形で見えることになり、単純にresumeだけを繰り返してきたセッション一覧とは見た目の密度が変わります。

実際にforkする手順

セッション内から名前を付けてブランチを作るには、/branchにそのまま名前を渡します。手順ごとのチェックポイントはセッションブランチの記事の「ブランチのやり方」も参照してください。

/branch try-streaming-approach

名前を省略すると、最初のプロンプト(コンパクション後はコンパクション前の元のプロンプト、v2.1.198以降)から自動で名前が付きます。コマンドラインから同じことをする場合は次のように組み合わせます。

claude --continue --fork-session

/branchの確認メッセージには新しいセッションIDと元のセッションIDの両方が表示されます。元のセッションは変更されないので、/resume <元のセッション名>で戻れます。

同じセッションを2つのターミナルで開いたときの落とし穴

フォークせずに同じセッションを2つのターミナルから同時に再開すると、両方からのメッセージが1本のトランスクリプトに交互に書き込まれます。片方が編集中のファイルをもう片方が知らずに触る、といった競合が起きやすいのはこのケースです。この現象がセッションピッカー上でどう見えるかはセッションブランチの記事の「分岐せずに同じセッションを2つの端末で開くとどうなるか」も参照してください。

forkとworktreeは分離する対象が違う

並行作業の分離方法としてforkとよく並べて語られるのがgit worktreeですが、両者が分離しているものは別のレイヤーです。forkが分離するのは会話(セッションID)で、作業ディレクトリは基本的に元のセッションと同じままです。worktreeが分離するのはディレクトリそのもので、ブランチごとに別々のチェックアウトを用意し、それぞれで独立したClaude Codeセッションを走らせます。

Claude Codeのセッションは作業ディレクトリに紐づくため、同じディレクトリのままgitブランチを切り替えると、Claudeが見るファイルは新しいブランチのものに変わりますが会話履歴は変わりません。逆に言えば、ディレクトリを分けない限り、forkしたコピー側も元のセッションと同じ作業ツリーを見ることになります。ファイル変更を伴う並行作業を本当に安全に分離したい場合は、forkによる会話の分岐とworktreeによるディレクトリの分離を組み合わせるのが実務上の解になります。

まとめ

resumeは同じセッションIDに新しいメッセージを積み、forkは会話をコピーして新しいセッションIDを作ります。resumeは会話履歴に加えてモデル・エージェント・権限モード・goalまで復元しますが、起動時フラグは戻らず渡し直しが必要です。forkはコピー時点までの履歴を引き継ぎつつ、バックグラウンドで動いていた処理は切り替え後の新セッション側に付いていきます。同じセッションを2つのターミナルで開くと書き込みが競合するため、並行作業をしたい時点で/branchかworktreeによる分離を選ぶのが実務上の判断基準になります。

判断に迷ったら、「今の会話をそのまま続けたいだけか」で分けるのが早道です。続けたいだけならresume、元の状態をそのまま残して別の道も試したいならfork、というのが両者の境界線です。

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