Claude Media
Claude Codeの/branchコマンドで会話を分岐する使い方

Claude Codeの/branchコマンドで会話を分岐する使い方

/branchは現在の会話をその時点で分岐し、別の方向性を試せるコマンドです。gitのブランチとは無関係で、/fork・/subtaskとは役割が違います。

Claude Codeの/branchコマンドとは

/branch [name]は、現在の会話をその時点で分岐し、それまでの流れを失わずに別の方向性を試せるコマンドです。実行すると分岐した会話に切り替わり、元の会話はそのまま保存されて/resumeで戻れます。

名前からgit branchを連想しますが、gitのブランチ操作とは無関係です。/branchが分岐させるのはClaude Codeとの会話そのもので、gitブランチを新規作成するコマンドではありません。「方針Aで進めた会話」と「方針Bを試した会話」を両方残しておきたいときの、会話版のスナップショット分岐です。

/resumeのピッカーには、実際のgitブランチで絞り込むCtrl+Bもあります。こちらは今いるgitブランチのセッションだけを表示する操作で、/branchで作った会話とは関係がありません。セッション分岐を運用の流れ(いつ枝を切り、どう戻るか)から見るならセッションをブランチして別方向を試すが向いています。ここではコマンド自体の仕様と、/fork・/subtaskとの違いを扱います。

gitのworktree作成・削除にフックで介入する方法はWorktreeCreate/WorktreeRemoveフックにまとめています。

分岐して、必要なら/resumeで元に戻る

/branch try-vitest
手順

/branchの流れ

  1. 1

    /branchを実行する

    名前を渡せばその名前の、省略すれば最初の実プロンプトから付いた名前の会話が、分岐時点までの履歴をコピーして作られます。

  2. 2

    分岐した会話に切り替わる

    確認メッセージには、いま入った分岐と元の会話の2つのセッションIDが出ます。

  3. 3

    /resumeで元に戻る

    元の会話はディスク上で変わらず、ピッカーに残っています。/resume <元の名前>かIDを渡して開き直します。

名前を省略した場合、v2.1.198以降は圧縮(compact)後でも圧縮後の要約ではなく最初のプロンプトから名前が作られます。それより前のバージョンは、Branched conversationという文字列そのものが名前になっていました。名前を付け忘れたときや変えたいときは、どのセッションにも使える/rename [name]で付け直せます。

セッションを開始・再開するときや/renameで、同じマシン上の生きたセッションと同じ名前を付けると、v2.1.232以降は後から付けた側がauth-refactor-graceful-unicornのような2語の接尾辞付きの名前に変わります。/branchで付ける名前に当てはまるかは、公式に明記されていません。

分岐は何を引き継ぎ、何を引き継がないのか

/branchは、トランスクリプトをコピーし、実行中のClaude Codeプロセスをそのコピーへの書き込みに切り替える操作です。新しいプロセスを起こすわけではないので、引き継ぎ方はコマンドラインの--fork-sessionと違ってきます。

状態/branchのあと
会話の履歴/branchのあと実行した時点までが分岐へコピーされる
「このセッションで許可」した権限/branchのあとそのまま有効。同じプロセスで動くため
実行中のバックグラウンドサブエージェント・バックグラウンドのBashコマンド/branchのあと動き続け、出力は元の会話でなく分岐側に出る
Remote Control接続/branchのあと維持される。スマホやブラウザは分岐の側を追う

権限の行が、コマンドラインからの分岐との分かれ目です。次のコマンドは--continueした会話を新しいセッションIDで別プロセスに起こすので、そちらでは「このセッションで許可」を選び直します。

claude --continue --fork-session

v2.1.285のclaude --helpでは、このフラグは次のように表示されます。--resumeまたは--continueと組み合わせて使う前提です。

  --fork-session   When resuming, create a new session ID
                   instead of reusing the original (use
                   with --resume or --continue)

注意したいのは、実行中のバックグラウンド処理の行き先です。長いテストや調査をバックグラウンドに出したまま/branchすると、その結果は分岐した側に届き、元の会話には戻ってきません。元の会話へ戻ったときに結果が見当たらなくて驚く、という場面はここから起きます。

同じセッションを2つの端末で、フォークせずに--resumeすると、双方のメッセージが1本のトランスクリプトに混ざります。並行して試したいなら、/branchか--fork-sessionで別のセッションIDにするのが本来の使い方です。

使い分けは進め方で決まります。いま開いているセッションのまま分岐して続けるなら/branchで、書き込み先がコピーへ切り替わるだけです。別の端末や別のプロセスで並行させたいならclaude --continue --fork-sessionで、新しいプロセスが別のセッションIDで始まります。

一つのセッションの中で少し前の状態に戻りたいだけなら、分岐ではなくチェックポイントによる巻き戻し(rewind)という別の仕組みがあります。会話を残したまま別案を並べたいときに/branchを選ぶ、という分担です。

/branch・/fork・/subtaskは何が違うのか

どれも「今の会話をもとに何かを始める」という入り口は同じです。違いは、あなた自身がどこにいて、結果がどこに返るかにあります。

使い分け

3つのコマンドの行き先

  • /branch [name]

    あなた自身が分岐した会話に切り替わります。元の会話は保存されたままで、/resumeで戻れます。

  • /fork [prompt]

    会話のコピーが新しいバックグラウンドセッションとして動き、あなたは元の会話に残ります。プロンプトを渡すとコピーはすぐ作業を始め、渡さなければagent viewで最初の指示を待ちます。

  • /subtask <task>

    会話全体を引き継いだサブエージェントが側の作業を進め、完了すると結果がこの会話に返ります。その間もあなたは元の会話を使い続けられます。

agent viewをオフにしている場合、/forkは従来のフォークされたサブエージェント挙動のままで、/subtaskは使えません。/subtaskが起動するのは会話全体を引き継ぐ特殊なサブエージェントです。一般的な委譲の型はSub-agents完全ガイドで扱っています。

なぜ紛らわしいのか — 改称と再定義の年表

紛らわしさの原因は、/forkの意味が2回変わったことです。/branchは最初の改称以降ずっと同じ動作を保っています。

あゆみ

/branchと/forkの変遷

  1. v2.1.77/forkが/branchに改称

    /forkはエイリアスとして残り、この時点では同じ動作でした。

  2. v2.1.11650MB超の分岐が通る

    トランスクリプトが50MBを超える会話を分岐すると失敗する不具合が直りました。

  3. v2.1.122巻き戻し後の分岐が通る

    rewindを使った会話の分岐が、tool_useのIDに対応するtool_resultが見つからないというエラーで失敗する問題が直りました。

  4. v2.1.129分岐後にセッションIDが出る

    それ以前は成功してもIDが表示されず、/resumeで開くには一覧から名前を探す必要がありました。

  5. v2.1.136複数行の名前が1行で保存される

    貼り付けた複数行のテキストを名前として渡すと、複数行のままセッションのタイトルに保存される不具合が直りました。

  6. v2.1.144worktree内でも分岐できる

    worktreeに入った後や一部のバックグラウンドセッションで、No conversation to branchと出て失敗する不具合が直りました。

  7. v2.1.161/forkがサブエージェント起動に

    /forkが/branchのエイリアスから、フォークされたサブエージェントを起動するコマンドに変わりました。v2.1.211まではこの動作です。

  8. v2.1.212/forkが再定義される

    /forkが会話をバックグラウンドセッションへコピーする動作になり、従来のサブエージェント起動は/subtaskへ移りました。

以前/branchを試して失敗した経験がある場合、上の不具合はいずれも直っています。claude updateで更新してから試し直せます。

ファイル編集も分けたいなら/forkのほうが向く

/forkのコピーには、コピーがその場で編集する設定でない限り、コードを変える前に自分専用のgit worktreeを作るよう、Claude Codeが指示します。この指示はv2.1.221以降で入っています。それ以前はコピーに隔離の指示がなく、元のセッションが作業中のworktreeやチェックアウトを、コピーが編集する可能性がありました。

バックグラウンドセッションにも隔離の仕組みがあります。バックグラウンドセッションは作業ディレクトリで始まり、ファイルを編集する前に.claude/worktrees/の下のworktreeへ移ります。すでにリンクされたgit worktreeの中にいる場合や、作業ディレクトリがgitリポジトリでなくWorktreeCreateフックも無い場合などは移りません。リポジトリ側でworktreeが扱いにくいときは、.claude/settings.jsonでworktree.bgIsolationを"none"にすると、バックグラウンドセッションが作業コピーを直接編集します。

/branchには、コマンドの定義にもセッションの解説にも、作業ツリーを分ける記述がありません。どちらも会話のコピーへ切り替えることしか書いていないからです。分岐した会話と元の会話から同じファイルを編集すると、変更が重なりうる点に注意が要ります。

会話の相談段階なら、この点は問題になりません。実装に入って両案を並行して書き分けたいときが、/forkやagent viewのバックグラウンドセッションへ寄せる場面です。

こんなときに使う

  • レビュー指摘への対応方針を2通り試したいが、どちらもそれまでの会話の文脈を引き継ぎたいとき
  • 大きな変更に着手する前に、現在の会話をチェックポイントとして分岐しておき、後から比較したいとき

たとえば、あるAPIのレスポンス形式を変える実装で、後方互換を保つ案と破壊的変更にする案が浮かんだとします。ここまでの調査結果や制約の議論を引き継いだまま、片方を/branchで分岐させて実装し、テストを走らせます。結果が思わしくなければ/resumeで分岐前に戻り、同じ文脈のまま別案を試せます。同じ背景を説明し直さなくて済む点が、新しいセッションを開くのとの違いです。

よくある質問

/branchで分岐した会話は、/resumeの一覧でどう見分けられますか

名前を付けていれば、その名前で並びます。/branchや--fork-sessionで作った会話は独立したセッションIDを持ち、別の行として並びます。同じセッションに複数のエントリが見つかると1行にまとまり、→キーで展開できます。

/resumeの一覧でbgのラベルが付くのはバックグラウンドセッションで、/branchで作った会話は通常のセッションとして並びます。会話をバックグラウンドへ切り離す操作は/backgroundが扱っています。

何回でも分岐できますか

回数の上限は公式ドキュメントに書かれていません。枝が増えると一覧が長くなるので、分岐のたびに/renameで目的が分かる名前を付けておくと、戻る先を見失いません。/branchの確認メッセージに出る元のセッションIDを控えておけば、名前を付け忘れても/resumeにIDを渡して戻れます。

まとめ

会話の方針を比べるだけなら/branch、コードまで両案を書き分けるなら/forkを入口にする、という線引きで迷いは減ります。実行中のバックグラウンド処理の出力が分岐側に届く点は、分岐する前に頭に置いておくと戸惑いません。

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