Claude CodeAnthropic の機能

FEATURE

Worktrees (ワークツリー)

Worktrees (ワークツリー) は、Claude Code の各セッションを専用の git worktree で動かす機能です。

提供中公式発表と照合済み
初出未調査
ページ更新
提供状態提供中
公式の記載で確認できた環境ターミナル
提供を確認できたプラン公式に記載なし
目次 CONTENTS
  1. できること
  2. 機能解説
  3. 使い方
  4. 利用シーン
  5. ChatGPT・OpenAI の対応する機能
  6. これまでの変更
  7. 関連する機能
  8. 出典
CAN DO

できること

POINT 01

セッションごとの分離

各セッションを専用の git worktree で動かし、編集するファイルのコピーを分けられます。既定では、リポジトリのルートの .claude/worktrees/<name>/ に、worktree-<name> という新しいブランチで作成されます。

POINT 02

サブエージェントの分離

Claude に「use worktrees for your agents」と依頼するか、カスタムサブエージェントの frontmatter に isolation: worktree を加えると、サブエージェントごとに一時的な worktree が割り当てられます。変更なしで終わったサブエージェントの worktree は自動で削除されます。

POINT 03

PR・MR から作成

--worktree に # 付きの番号、GitHub のプルリクエスト URL、GitLab のマージリクエスト URL を渡すと、その変更の head コミットを origin から取得し、.claude/worktrees/pr-<number> に worktree を作成します。

GUIDE

機能解説

概要

セッションごとに編集用のファイルのコピーが分かれるため、一方のセッションで機能を作り、別のセッションでバグを直すといった並行作業に使えます。ターミナルから --worktree フラグで起動できるほか、セッションの途中で Claude に「work in a worktree」と依頼して作成することもできます。

Worktrees は、Claude Code のセッションを git worktree 単位で分け、セッションごとに別々のファイルのコピーを編集させる機能です。

  • ターミナルでは --worktree (-w) で起動します。既定の作成場所はリポジトリのルートの .claude/worktrees/<name>/ で、ブランチ名は worktree-<name> です。
  • --worktree に渡した名前の worktree がすでにあれば、新しく作らずにその worktree を開きます。
  • セッションの途中で「work in a worktree」と依頼すると、Claude が EnterWorktree ツールで worktree を作成します。リポジトリの .claude/worktrees/ の外のパスに入る場合は、先に承認を求めます。
  • worktree の中で終了せずに終わったセッションを再開すると、セッションはその worktree に戻ります。
  • メインのチェックアウトからプロジェクトスコープでインストールしたプラグインは、同じリポジトリの worktree でも読み込まれます。

分離の仕組みと注意点

セッションが worktree に分離されている間、メインのチェックアウト内のパスを対象とする Edit、Write、NotebookEdit の呼び出しはブロックされます。

一方で、この分離のチェックはシェルコマンドが書き込むファイルを追跡しません。そのため、cp やシェルのリダイレクトのように、git を実行せずにメインのチェックアウトへ書き込むコマンドは拒否されません。

worktree の後片付け

  • 対話型の worktree セッションを終了すると、変更済みまたは未追跡のファイル、サブモジュール内の未コミットの作業、新しいコミットなど、削除で失われる作業が無いかを確認します。
  • 作業が無い場合、名前の無いセッションでは worktree とブランチを自動で削除し、名前付きのセッションでは先に確認を求めます。
  • -p による非対話の実行には終了時の確認が無いため、その worktree は Claude が片付けません。
  • サブエージェントやバックグラウンドセッション用に Claude が作った worktree は、cleanupPeriodDays 設定より古くなると、定期的な処理で削除されます。
  • Claude が管理する worktree は、エージェント終了時にロック解除された状態で残るため、git worktree remove / prune で削除できます。
  • git worktree remove が失敗しても rm -rf には切り替えないため、gitignore 対象のファイルや作業中のファイルは消えません。

分岐元とファイル・作成処理の設定

  • 分岐元の選択: worktree.baseRef 設定 (fresh | head) で、--worktree、EnterWorktree、エージェント分離用の worktree が origin/<default> から分岐するか、ローカルの HEAD から分岐するかを選べます。既定値は fresh で、未プッシュのコミットを新しい worktree に残すには worktree.baseRef: "head" を設定します。ブランチ名は指定できません。
  • gitignore 対象ファイルのコピー: プロジェクトのルートに .worktreeinclude ファイルを置くと、.env のような未追跡のファイルを新しい worktree に自動でコピーします。書式は .gitignore と同じで、パターンに一致し、かつ gitignore 対象のファイルだけがコピーされます。
  • バックグラウンドセッションの分離を外す: worktree.bgIsolation: "none" を設定すると、worktree が実用的でないリポジトリで、バックグラウンドセッションが EnterWorktree を使わずに作業コピーを直接編集します。
  • 作成処理の置き換え: WorktreeCreate hook で既定の git worktree の処理を丸ごと置き換えられ、.claude/worktrees/ 以外の場所にも作成できます。SVN、Perforce、Mercurial などでは、WorktreeCreate と WorktreeRemove の hook で作成と後片付けの処理を用意します。hook を使う場合、--worktree では .worktreeinclude が処理されないため、ローカルの設定ファイルは hook のスクリプト内でコピーします。
HOW TO USE

使い方

ターミナルから --worktree フラグを付けて Claude Code を起動するのが基本の流れです。

  1. --worktree または -w に名前を付けて起動します (例: claude --worktree feature-auth)。分離された worktree が作られ、その中で Claude が起動します。名前を省略すると、bright-running-fox のような名前が自動で付きます。
  2. 別のターミナルで、異なる名前を付けて同じコマンドを実行すると、2 つ目の分離されたセッションを始められます。
  3. 対話セッションを終了するとき、worktree に作業が残っていれば、残すか削除するかを選びます。後で戻るときは、終了時に表示される claude --worktree <name> --resume コマンドを実行します。
公式ヘルプを開く ↗
USE CASES

利用シーン

CASE 01

新機能の実装とバグ修正を、別々のセッションで同時に進める場面に向いています。

CASE 02

特定のプルリクエストやマージリクエストの内容を、手元の作業と分けて確認・修正する場面に使えます。

CASE 03

複数のサブエージェントに作業を分担させ、それぞれの編集を別の worktree に分けておきたい場面に向いています。

CASE 04

SVN、Perforce、Mercurial など git 以外のバージョン管理を使うプロジェクトでは、hook で作成と後片付けの処理を用意して使えます。

COMPARISON

ChatGPT・OpenAI の対応する機能

比較の単位となる業務: git worktree を使った作業ブランチの分離と並行開発

Codex の Worktrees も、--worktree で新規またはフォークしたセッション用の分離されたチェックアウトを作成し、閲覧・再開できます (Codex では実験的な機能で、/worktree も使えます)。Claude Code では --worktree で worktree を作成し、/fork でフォークしたセッションは自身の新しい worktree を作り、終了時に表示される --resume 付きのコマンドで戻れます。

分岐元の指定には違いがあります。Codex では新しい worktree の開始ブランチを選ぶか、現在のローカルの変更を含められます。Claude Code の worktree.baseRef は fresh (origin/<default>) と head (ローカルの HEAD) から選ぶ設定で、ブランチ名は指定できません。

TIMELINE

これまでの変更

  1. worktree の作成と再利用で、git がオブジェクトをオンデマンドで取得しなくなりました。対象は通常のクローンと、Bash サンドボックスを設定した partial clone で、partial clone では先にオブジェクトを取得します。

  2. 大規模リポジトリでの --worktree の起動が改善され、新しい worktree が並列にチェックアウトされるようになりました (git 2.32 以上)。

  3. --worktree フラグと claude agents ビューで、GitLab のマージリクエスト URL に対応しました。

  4. /fork でフォークしたセッションは、元のセッションのチェックアウトではなく、自身の新しい worktree を作るようになりました。

  5. EnterWorktree が、プロジェクトの .claude/worktrees/ の外の git worktree に入る前に確認を求めるようになりました。

  6. EnterWorktree で、セッション途中に Claude 管理の worktree 間を切り替えられるようになりました。Claude が管理する worktree は、エージェント終了時にロック解除されたまま残るようになりました。

  7. worktree.bgIsolation: "none" 設定が加わりました。worktree の後片付けで rm -rf に切り替えないようになりました。

  8. --worktree が既存または古い worktree と衝突したときのエラーメッセージが改善されました。

  9. worktree.baseRef 設定 (fresh | head) が加わりました。既定の fresh により、EnterWorktree の分岐元は origin/<default> に戻りました。

  10. EnterWorktree が、origin/<default-branch> ではなくローカルの HEAD から新しいブランチを作るようになり、未プッシュのコミットが失われなくなりました。

  11. EnterWorktree ツールに path パラメータが加わり、現在のリポジトリの既存の worktree に切り替えられるようになりました。また、PR が squash マージされた古いエージェント worktree も削除されるようになりました。

  12. ステータスラインの JSON 入力に workspace.git_worktree が加わり、現在のディレクトリがリンクされた git worktree 内にあるときに設定されます。

  13. --resume で、同じリポジトリの別の worktree のセッションを、cd コマンドを表示せずに直接再開できるようになりました。

SOURCES

出典

出典 13 件を表示