Claude Media
Claude Codeでセッションをブランチして別方向を試す

Claude Codeでセッションをブランチして別方向を試す

/branchは会話のコピーを作って切り替えるコマンドです。元のセッションを壊さずに別実装を試す手順と、チェックポイントによる巻き戻しとの違いを見分けます。

このTipsでできること

/branchは、今の会話をそのままコピーして新しいセッションを作り、その新しいセッションへ自動的に切り替えるコマンドです。元のセッションはディスク上に手つかずのまま残るので、「試したい実装方針が2つあるが、片方が失敗しても元の状態は失いたくない」という場面で使えます。

似た目的で使われがちな/rewind(チェックポイントによる巻き戻し)とは仕組みが別物です。/rewindは同じセッションの中で過去の時点へ戻る操作であるのに対し、/branchは会話を複製して別のセッションとして分岐させる操作です。両者の使い分けは本記事の最後で扱います。

ブランチのやり方

セッション内から名前を指定して実行します。

/branch try-streaming-approach

名前を省略すると、Claude Codeは会話の最初のプロンプトから新しいブランチの名前を自動生成します。v2.1.198以降はこの自動命名が圧縮(compaction)後でも機能するようになり、要約に埋もれた最初のプロンプトまで遡って名前を付けます。それより前のバージョンでは、圧縮済みの会話で名前を省略するとBranched conversationという文字通りの名前にフォールバックしていました。

コマンドラインから起動する経路もあります。--continueまたは--resume--fork-sessionを組み合わせます。

claude --continue --fork-session

/branchを実行すると、確認メッセージに2つのセッションIDが表示されます。今切り替わった新しいブランチのIDと、元セッションのIDです。元セッションはディスク上で変更されずセッションピッカーにも残り続けるので、/resume <元の名前>かIDを渡せばいつでも戻れます。この2つのIDはその場でメモしておくと、後から名前を付け忘れても確実に両方へ戻れる保険になります。

ブランチ後に何が引き継がれ、何が引き継がれないか

/branchが実質的にやっているのは「トランスクリプトをコピーして、実行中のClaude Codeプロセスの書き込み先を新しいトランスクリプトに切り替える」ことです。この仕組みの違いが、何が引き継がれるかを決めています。

状態ブランチ後
会話履歴ブランチ後/branchを実行した時点までコピーされる
セッション中の権限許可(「このセッションでは許可」)ブランチ後引き継がれる。同じプロセス内で動くため既存の許可がそのまま有効。--fork-sessionで別プロセスにフォークした場合は引き継がれず、新しいプロセス側で再承認が必要
実行中のバックグラウンドサブエージェント・バックグラウンドBashコマンドブランチ後動作を継続する。ただし出力は切り替え先の新しいブランチに表示され、元のセッションには表示されない
Remote Controlの接続ブランチ後接続を維持する。スマートフォンやブラウザから接続していれば、そのままブランチ後のセッションのメッセージを受け取り続ける

Remote Control経由でスマートフォンから操作しているときにこの挙動は特に効きます。PCで/branchを実行すると、スマートフォン側は元のセッションではなく自動的に新しいブランチへ追従し、それ以降のメッセージを受け取ります。元のセッションに戻って操作したい場合は、スマートフォン側でも改めてそのセッションへ接続し直す必要があります。

同じプロセス内での/branchと、--fork-sessionで別プロセスに分けるフォークとで、権限許可の扱いが変わる点が実務上の分岐点です。厳密に隔離した状態で試したいなら別プロセスのフォークを、権限確認の手間を省いて素早く分岐したいなら/branchを選びます。

バックグラウンドで動いていたタスクの出力が新しいブランチ側に付くという挙動は見落としやすいポイントです。重い調査タスクを裏で走らせている最中に/branchすると、その調査結果は元セッションではなく分岐後のセッションに届きます。

分岐せずに同じセッションを2つの端末で開くとどうなるか

/branchを使わずに、同じセッションを2つの端末から--resumeで同時に開いて作業すると、両方の端末から送ったメッセージが1つのトランスクリプトに割り込んで混ざります。会話が1本の時系列に交互に積み重なる形になるため、片方の端末で試した内容だけを後から切り離すことはできません。

これが/branchを使う理由そのものです。分岐しておけば、片方の端末(元のセッション)はそれまでの状態のまま止まり、もう片方(新しいブランチ)だけが以後の変更を受け取ります。2つの実装方針を同時に試したいときは、同じセッションを2端末で開くのではなく、必ず/branchで明示的に分けてから作業します。

使いどころの例

たとえばAPIのレスポンスをストリーミング配信するか、一括で返すかで実装方針が割れているとします。まず一括返却の実装で会話を進め、ある程度形になった時点で/branch stream-approachを実行すると、ストリーミング版を試す新しいブランチに切り替わります。ストリーミング版がうまくいかなければ、/resumeで元のセッション名を指定するだけで一括返却版の会話にそのまま戻れます。逆にストリーミング版の方が良ければ、そちらのブランチで作業を続ければよく、一括返却版のセッションは検証済みの比較対象として残しておけます。

このとき両方のブランチに名前を付けておくと、後から見返したときにどちらがどの方針かをタイトルだけで判別できます。

同じ発想は、3つ以上の実装候補を比較したいときにも使えます。ベースとなる会話から/branchを候補の数だけ繰り返し、それぞれに方針が分かる名前を付ければ、後から/resumeでどの候補にも直接戻れる状態を保ったまま並行して検証できます。1つの会話を上書きしながら試行錯誤する場合と違い、比較検討が終わるまでどの案も失わずに残せる点が/branchを使う最大の利点です。

セッションピッカーでの見え方

/branch--fork-sessionで分岐したセッションは、それぞれ独立したセッションIDを持ち、セッションピッカー上では別の行として表示されます。同じ元セッションから複数回分岐すると、ピッカーは同一の会話グループとしてまとめて表示し、キーで展開すると個々の分岐が見られます。分岐が増えてどれがどの試行か分からなくなってきたら、/renameでブランチごとに名前を付け直すと判別しやすくなります。

ブランチとrewind・checkpointingは何が違うか

Claude Codeには過去へ戻る手段が複数あり、目的によって選ぶべきものが変わります。

巻き戻し系コマンドの全体像

/rewindはプロンプトごとに自動保存されるチェックポイントを使い、同じセッションの中でコードと会話を過去の時点まで戻す、または要約するコマンドです。/checkpoint/undoという2つのエイリアスを持ちます。詳しい挙動と復元できない操作の一覧はClaude Code rewindコマンドで/clear前まで戻るで扱っています。

/clearは会話履歴を空にするだけでファイルは変更しません。/compactは現在の会話をその場で圧縮します。どちらも同じセッション内で完結する操作です。

/subtaskは巻き戻しとは別方向の隣接コマンドです。今の会話を引き継いだサブエージェントをバックグラウンドで実行し、完了すると結果が元の会話に戻ってきます。/branchが会話そのものを分岐させて手元の操作を続けるのに対し、/subtaskは分岐した側の作業を裏で進めさせて結果だけを回収する使い方です。

なお/forkという名前も過去に存在しました。v2.1.77で/branchへ改名され、当時はエイリアスとして/forkも使えましたが、v2.1.212以降は/forkが別機能に再利用され、v2.1.221以降はworktreeを作るコマンドになっています。現在この記事で扱っている「会話を分岐する」操作は/forkではなく/branchを使います。

/branchはこれらと違い、元のセッションを一切変更せず、別のセッションとして複製する点が本質的な違いです。/rewindで過去に戻ると、その時点より後の会話は(要約に畳まれるか)失われますが、/branchなら元のセッションは分岐前の状態のまま保存され続け、新しいセッション側で自由に別方針を試せます。「元の実装は残しつつ、別のアプローチも並行で検証したい」という場面では/rewindではなく/branchを選ぶのが適切です。

コードの変更履歴という観点では、/branchはあくまで会話とプロセスの分岐であり、ファイルシステム上の変更そのものを分離するわけではありません。実装ごとにファイルの変更履歴まで完全に分けたいなら、gitのブランチやworktreeによる物理的な作業ツリーの分離と組み合わせる運用が必要です。

よくある質問

/branch--fork-sessionはどちらを使うべきですか

同じClaude Codeプロセス内で素早く分岐したいなら/branch <名前>、権限許可も含めて完全に別プロセスへ隔離したいならclaude --continue --fork-sessionを使います。前者はセッション中の許可がそのまま引き継がれ、後者は新しいプロセスとして起動するため権限を再承認します。

名前を省略して/branchするとどうなりますか

会話の最初のプロンプトから自動で名前が付きます。v2.1.198以降は、会話がすでに圧縮されていても最初のプロンプトまで遡って命名しますが、それより前のバージョンではBranched conversationという文字通りの名前になります。後から気に入らなければ/renameで付け直せます。

ブランチしたセッションを消すと元のセッションに影響しますか

影響しません。/branchは元のセッションのトランスクリプトをコピーして新しいセッションとして書き込むため、両者はディスク上で別ファイルとして独立しています。分岐後のセッションだけを整理しても、元のセッションの会話履歴やチェックポイントは変わりません。

まとめ

会話を分岐させる操作である/branchは、コードの巻き戻しを行う/rewindとは別の道具です。/branch <名前>、またはclaude --continue --fork-sessionで、今の会話を保ったまま別セッションに分岐できます。同じプロセス内の/branchは権限許可やRemote Control接続を引き継ぎますが、--fork-sessionで別プロセスにフォークすると権限は再承認が必要です。元のセッションは変更されずに残るので、実装方針が複数あって片方が失敗しても元の状態を失いたくないときに使います。チェックポイントによる同一セッション内の巻き戻しが必要なら/rewind、会話ごと別方向に分岐したいなら/branchと覚えておくと迷いません。

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