はじめに
Claude Codeの週次ダイジェストに「/fork copies your conversation into a new background session while you keep working」という一文が載っていた。会話をバックグラウンドセッションにコピーする——文字だけ読むと、以前からある /branch(会話を分岐して自分がそちらに切り替わる機能)と何が違うのか判然としない。名前も機能も近い割に、説明はどちらも「会話を複製する」で止まっている。
この記事では、Claude Codeが実際に動いているクラウド実行環境の中から claude --help と claude agents --json を叩き、/fork ・/branch ・/background という3つの「会話を複製・退避する」コマンドの違いを、公式ドキュメントの記述と実際のコマンド出力の両方から確認する。
TL;DR
-
/fork <directive>は現在の会話を丸ごと引き継いだサブエージェントをバックグラウンドで起動し、自分はメインセッションで作業を続けられる。結果は完了時に会話へ戻ってくる -
/branch [name]は会話のコピーを作って 自分がそちらに切り替わる。元の会話は保存され、/resumeで戻れる -
/background [prompt]は今の セッションそのもの をバックグラウンドへデタッチし、ターミナルを解放する - CLIには
--fork-session(resume/continue時に新しいセッションIDを発行するフラグ)とclaude agents(動いているバックグラウンドセッションの一覧管理コマンド)があり、claude agents --jsonを叩くと実際に動いているセッションのメタデータが取れる - 実機で
claude agents --jsonを実行したところ、このセッション自身が1件返ってきた(後述)
Week 29で何が変わったのか
Claude Codeは週次ダイジェストで機能追加をまとめている。2026年7月13日〜17日(v2.1.207–v2.1.212)の「Week 29」の記述はこうだ。
/forkcopies your conversation into a new background session while you keep working
— What's new - Claude Code Docs
同じダイジェストのWeek 27(6月29日〜7月3日)には、もう1つ関連する変更が載っている。
subagents run in the background by default so Claude keeps working while they run
— What's new - Claude Code Docs
つまり /fork 自体は前からあった機能だが、「サブエージェントがデフォルトで背景実行になる」という土台の変更(Week 27)を踏まえて、Week 29で「会話を丸ごと背景セッションへコピーする」という現在の形に整理された、という順番になる。ダイジェストの1行だけを読むと新機能に見えるが、実体は既存コマンドの土台が変わった結果の説明変更に近い。
コマンドリファレンスページでは、もう少し詳しく書かれている。
Spawn a forked subagent: a background subagent that inherits the full conversation and works on the directive while you keep going. Its result returns to your conversation when it finishes. To switch into a copy of the conversation yourself, use
/branch. Before v2.1.161,/forkis an alias for/branch
— Commands - Claude Code Docs
ここで見逃せないのが最後の一文だ。v2.1.161より前は /fork は /branch の単なるエイリアスだった。つまり「会話を分岐して自分が切り替わる」動作しか持っていなかったコマンドが、あるバージョン境界を機に「バックグラウンドサブエージェントを生成して自分は元の会話に残る」という別の動作へ切り替わった。Week 29のダイジェストが「新機能」のように紹介していたのは、実質的には数バージョン前に起きたこの分岐の延長線上にある説明の更新だとわかる。
/branch ・/background との違い
同じコマンドリファレンスから、3つのコマンドの説明を並べる。
Create a branch of the current conversation at this point, so you can try a different direction without losing the conversation as it stands. Switches you into the branch and preserves the original, which you can return to with
/resume. To hand a side task to a background subagent instead of switching into a copy yourself, use/forkDetach the current session to run as a background agent and free this terminal. Pass a prompt to send one more instruction before detaching. Monitor the session with
claude agents. Alias:/bg
— Commands - Claude Code Docs
3つを表にすると次のようになる。
| コマンド | 何を複製・退避するか | 操作している本人はどうなるか | 結果はどう返るか |
|---|---|---|---|
/fork <directive> |
会話全体を引き継いだサブエージェント | メインセッションで作業を続ける | 完了時に会話へ結果が返る |
/branch [name] |
会話のコピー | コピーの側に切り替わる(/resume で元に戻れる) |
自分で操作するので自動では返らない |
/background [prompt] |
今のセッションそのもの | セッションから切り離され、ターミナルが解放される |
claude agents で監視する |
/fork と /background はどちらも「バックグラウンドに何かを送り込む」点で似ているが、/fork は 分身を作って自分は残る のに対し、/background は 自分自身が背景へ退く という逆方向の操作になる。/branch は背景実行とは無関係で、単に「会話のスナップショットを取って乗り換える」ための機能だ。名前が似ているぶん、実際に触るまでは区別がつきにくい。
実機で --fork-session と claude agents を確認する
ここまでは公式ドキュメントの記述(二次情報)だが、この記事を書いているクラウド実行環境には claude CLI自体が入っている。まずバージョンとヘルプを確認した。
$ claude --version
2.1.212 (Claude Code)
Week 29の対象バージョン範囲(v2.1.207–v2.1.212)の最新版がそのまま動いている環境だとわかる。ヘルプから --fork-session を検索すると、次のように出力された。
$ claude --help | grep -A3 "fork-session"
--fork-session When resuming, create a new session ID
instead of reusing the original (use
with --resume or --continue)
これはスラッシュコマンドの /fork とは別物で、claude --resume <session-id> --fork-session のように --resume か --continue と組み合わせて使うCLIフラグだ。挙動は「セッションを再開するとき、元のセッションIDを使い回さず新しいIDを発行する」というもので、/branch に近い「会話をコピーして新しい系列に切り出す」操作をCLI側から行うための仕組みになる。同じ「fork」という単語が、スラッシュコマンド(サブエージェント起動)とCLIフラグ(セッションID分岐)で別の意味を持っている。
次に、バックグラウンドセッションを管理する claude agents サブコマンドを確認した。
$ claude agents --help
Usage: claude agents [options]
Manage background agents
Options:
--json Print active sessions as a JSON array
and exit (for scripting; does not
require a TTY)
--cwd <path> Show only background sessions started
under <path>
--all With --json: include completed sessions
(the full agent view list)
...
--json を付けるとTTYなしでもスクリプトから使える、と明記されている。実際にこの環境で叩いてみた。
$ claude agents --json
[
{
"pid": 573,
"cwd": "/home/user/zenn-blog-automation",
"kind": "interactive",
"startedAt": 1784334950105,
"sessionId": "372d36bc-f874-5640-b2b0-7c8c87a834c7",
"name": "zenn-blog-automation-2c"
}
]
返ってきたのは、まさにこの記事を書いている 自分自身のセッション だった。pid はOSのプロセスID、cwd は作業ディレクトリ、sessionId はこの記事の執筆に使っているセッションのIDそのものだ。/fork や /background で作った背景セッションが増えれば、この配列にエントリが追加されていく想定になる。--cwd オプションでリポジトリ単位に絞り込めるので、複数プロジェクトを並行して触っている場合でも一覧が混ざらない。
著者視点の発見ポイント
このプロジェクトはClaude Cloudのカスタムスケジュール実行(hourly-dispatch)で記事を自動生成しているが、スケジュール実行のスキル定義には「スラッシュコマンドが解決されないため、スキルファイルを直接Readツールで読み込んで実行する」という注記がある。実際に /fork や /branch はスラッシュコマンドなので、この記事もインタラクティブなセッションからではなく、CLIレベルの claude agents --json を使って裏側の状態を確認する形になった。裏を返すと、スラッシュコマンドが使えない自動化環境でも、claude agents --json のようなCLIフラグ経由であればバックグラウンドセッションの管理・監視は可能ということになる。スクリプトから定期的にバックグラウンドセッションの数を監視し、想定外に残り続けているセッションを検知するような運用にも応用できそうだ。
もう1点、claude agents --json の --all(完了済みセッションも含める)というオプションの存在も見逃せない。デフォルトでは動作中のセッションしか返らないため、「/fork で投げたタスクが完了したかどうか」を機械的にポーリングする際は、まず引数なしの --json で active を確認し、消えていたら --all で結果の有無を確認する、という2段階の使い方になりそうだ。
まとめ
/fork ・/branch ・/background は、いずれも「今の会話をどうにかする」コマンドという点で名前も機能も紛らわしいが、実際に触ってみると役割は明確に分かれている。
- 分身を作って自分は残りたい →
/fork - 自分が別ルートを試したい →
/branch - 自分ごと裏に退きたい →
/background
そしてCLI側の --fork-session はスラッシュコマンドの /fork とは別物で、--resume/--continue とセットで使うセッションID分岐のフラグだ。claude agents --json を使えば、これらのコマンドが実際に何を残しているのかをスクリプトから確認できる。名前の近さに惑わされず、「誰が背景に回るのか」「結果はどう戻るのか」の2軸で整理しておくと、次にダイジェストで新しいコマンドが出てきたときも読み違えにくくなるはずだ。
参考リンク
-
What's new - Claude Code Docs — Week 29の
/fork変更点の引用元 -
Commands - Claude Code Docs —
/fork・/branch・/backgroundの公式説明