
Claude Code で作業していると、Claude の処理を眺めて待つだけの時間ができますよね?皆さん、この間何してます?
この待ち時間は、並行開発の仕組みを組み合わせれば消せるよね?という話
- 会話を分岐する
/branch - 会話ごと並走させる
/fork - 脇道の質問をする
/btw - ファイルの衝突を防ぐ git worktree
- 補助役として
.worktreeinclude
最新のチェンジログ情報だけ見て喜ぶんじゃなくて
基本的なものを実践で使っていかないといけないよね
ネタ元は、Ubie の鹿野壮さん(@tonkotsuboy_com)の登壇スライド「【Claude Code】鹿野さんに聞く 私の推しの並行開発環境 大公開」
タイトル見て「あらいいですね」と思って、読んでみたら「やるじゃない!ニコッ」となって、絶対これ取り入れようってなった
ということで、この記事では、スライドに登場する仕組みを公式ドキュメントの記述で確認しながら、どれをいつ使うかまで整理するよ
X で毎日 AI 情報を配信してるコムテです。Claude Code テクニックを配信しています
並行開発には2つのレイヤーがある
最初に全体の地図。ひとくちに並行開発といっても、分離する対象が2つある
| レイヤー | 担当 | 何を分けるか |
|---|---|---|
| 会話の並行 | /branch /fork /btw | セッションと文脈 |
| ファイルの並行 | git worktree | 作業ディレクトリ |
公式ドキュメントも、worktree はファイル編集を隔離するもの、サブエージェント(本体とは別に動く作業用エージェント)は作業そのものを進めるもの、と役割を分けている。それを会話とファイルの2レイヤーに広げたのが上の表
つまり「会話をどう増やすか」と「ファイルをどう守るか」は別の問題ということ
まずは会話の側からですな
/branch 会話をコピーして別アプローチを試す
/branch は、ここまでの会話のコピーを作って、自分がそのコピーに移るコマンド。元のセッションは無傷のまま残る
名前を省略すると、会話の最初のプロンプトから自動で命名される。CLI から始めるなら、--continue や --resume に --fork-session を組み合わせると同じ分岐になる
実行すると、いま移った分岐と元セッション、2つのセッションIDが表示される。元に戻るには /resume にIDか名前を渡すか、セッションピッカー(セッションの一覧画面)から選ぶ
ピッカー上では、/branch で作った分岐は元セッションの下にグループ表示される。→ キーで展開できるので、分岐が増えても迷子にならない
「このセッションでは許可」で承認したツール許可は、分岐先には引き継がれない。もう1つ、フォークせずに同じセッションを2つの端末で resume すると、両方のメッセージが1つの会話ログに交ざる。並行するなら必ず分岐してから
/fork 会話を丸ごと引き継いだ並走サブエージェント
通常のサブエージェントは、まっさらなコンテキストで起動する。/fork はその逆で、ここまでの会話を丸ごと引き継いだサブエージェントを走らせる
システムプロンプト、ツール、モデル、会話履歴のすべてがメインセッションと同一。状況を説明し直さずに、続きの作業をそのまま任せられる
これは公式ドキュメントの例。ここまでのパーサー変更のテスト下書きを fork に任せて、自分はメインで実装を続けられる
fork のツール実行はメインの会話には入らず、終わると最終結果だけがメッセージとして届く。メインのコンテキストは汚れない
走っている fork はプロンプト入力欄の下のパネルに並ぶ。Enter でその fork の会話ログを開いて追加の指示を送れるし、x で実行中の fork を止めたり終わった fork を片付けたりできる
利用には Claude Code v2.1.117 以降が必要で、v2.1.161 からはデフォルトで有効。なお fork がさらに fork を生むことはできない
コスト面も有利。システムプロンプトとツール定義が親と同一なので、最初のリクエストで親のプロンプトキャッシュ(同じ入力の再計算を省く仕組み)を再利用できる
だから同じ文脈が必要な作業なら、新しいサブエージェントを立てるより fork のほうが安く済む
/branchと/forkはどう違うのか
どちらも「ここまでの会話」から始まる点は同じ。違いは、自分がどちら側にいるか
/branch は自分が分岐先に乗り移って、そこで作業を続ける。/fork は自分はメインに残ったまま、並走する fork に作業させて結果だけ受け取る
通常のサブエージェントも含めて並べると、立ち位置がはっきりする
| コンテキスト | 自分の位置 | 結果 | |
|---|---|---|---|
/branch | 会話のコピー | 分岐先に移る | 分岐先で直接作業 |
/fork | 会話を丸ごと継承 | メインに残る | 最終結果だけ届く |
| 通常のサブエージェント | 空から開始 | メインに残る | 最終結果だけ届く |
実験に自分で没頭するなら /branch、本流を止めたくないなら /fork、会話の文脈が要らない独立タスクなら通常のサブエージェント、という整理
/btw 作業を止めずに脇道の質問をする
/btw は、いまの作業について1往復だけ質問できるコマンド。質問と答えはオーバーレイ(画面に重なる小窓)に表示され、会話履歴には一切残らない
Claude が作業している最中でも実行できる。脇道の質問は独立して動くので、メインのターンを中断しない
ただしツールは使えない。ファイルを読んだり検索したりはせず、すでにコンテキストにあるものだけから答える
公式ドキュメントの対比がわかりやすくて、/btw はサブエージェントの逆。会話は全部見えるがツールがない。サブエージェントはツールを持つが、空のコンテキストから始まる
オーバーレイ内で追加の質問はできない設計。コストは小さく、親のプロンプトキャッシュを再利用して動く
見落とされがちなのが f キー。答えの表示中に押すと、その質問と答えごと新しいセッションに fork して、ツール付きで調査の続きができる(ローカルセッション限定)。元のセッションは /resume に残る
git worktreeでファイルの衝突を防ぐ
ここからファイルの並行。git worktree は、リポジトリの履歴とリモートを共有したまま、別の作業ディレクトリと別のブランチを持てる git の機能
セッションごとに worktree を分ければ、一方のセッションの編集がもう一方のファイルに触れることはない。片方で機能開発、もう片方でバグ修正、が安全に並ぶ
Claude Code ならフラグ1つで作れる。省略形は -w
リポジトリルートの .claude/worktrees/feature-auth/ に worktree ができて、worktree-feature-auth という新しいブランチで始まる。名前を省略すれば bright-running-fox のような名前が自動でつく
フラグを忘れても大丈夫で、セッション中に「worktree で作業して」と頼むだけでも Claude が worktree を作ってくれる
分岐元はリポジトリのデフォルトブランチ(origin/HEAD)。リモートと揃ったきれいな状態から始まる
手元の未プッシュコミットを持ち込みたいときは、settings で worktree.baseRef を "head" にすると、ローカルの HEAD 起点に変わる
終了時の後片付けも組み込まれている。変更が何もなければ worktree とブランチは自動で削除される(名前をつけたセッションだけは、残すかどうか確認される)
変更が残っているときは、keep(残す)か remove(削除)かの確認が出る。あとで戻るつもりなら keep を選べばいい
.claude/worktrees/ を .gitignore に追加しておくと、worktree の中身がメインの作業ツリーで未追跡ファイルとして表示されなくなる。公式ドキュメント推奨のひと手間
.worktreeincludeで.envを新しいworktreeに持ち込む
worktree には1つ困りごとがある。新規のチェックアウトなので、gitignore している .env や .env.local が存在しない
worktree を量産するほど、こうしたファイルを手でコピーして回る手間が増える
解決策は、プロジェクトルートに .worktreeinclude というファイルを置くこと。書式は .gitignore と同じで、書いたパターンに一致するファイルが新しい worktree に自動でコピーされる
コピーされるのは「パターンに一致して、かつ gitignore されているファイル」だけ。追跡済みのファイルが複製されることはない安全設計
適用範囲も広い。--worktree で作る worktree に加えて、サブエージェント用の worktree、デスクトップアプリの並行セッションでも同じように処理される
worktree の作成を WorktreeCreate フック(作成処理を自前スクリプトに差し替える設定)に置き換えている場合、.worktreeinclude は処理されない。必要なコピーはフックのスクリプト内で行う
サブエージェントもworktreeに隔離できる
worktree の隔離はサブエージェントにも使える。頼み方は「エージェントには worktree を使って」と言うだけ
いつも隔離したいカスタムサブエージェントなら、定義ファイルの frontmatter(先頭の設定欄)に1行足す
各サブエージェントは一時的な worktree をもらって作業し、変更がなければ終了時に自動で削除される。分岐元のブランチは --worktree と同じルールで決まる
どれをいつ使うか(使い分け表)
ここまでの道具を1枚の表にする
| 機能 | 分離されるもの | 自分の作業 | ツール | 向く場面 |
|---|---|---|---|---|
/branch | 会話(コピーに移る) | 分岐先で続ける | あり | 本流を汚さない実験 |
/fork | 作業の過程 | メインで続ける | あり | 文脈ごと任せる副作業 |
/btw | 履歴に何も残らない | メインで続ける | なし | 文脈ありの即答 |
--worktree | 作業ディレクトリ | 別セッションで並行 | あり | ファイルが衝突する作業 |
迷ったら3つの質問で決まる。ツールが要らない質問なら /btw、会話の文脈ごと動かしたいなら /fork(自分が移るなら /branch)、ファイルがぶつかるなら worktree
まとめ
並行開発環境は「会話の並行」と「ファイルの並行」の組み合わせ。/branch と /fork で会話を増やし、/btw で本流を守り、worktree でファイルを分ける
そこに .worktreeinclude まで置けば、worktree を量産しても .env の手コピーは発生しない。Claude の処理を眺めて待つだけの時間が消えていく
仕様の詳細は公式ドキュメント