--worktree(ワークツリー)

起動オプション
--worktree
ワークツリー
Claude Codeを起動するときに後ろに付ける追加スイッチ。叩くと、そのプロジェクトの中に「同じプロジェクトの別ブランチ用フォルダ」を1つ作って、その中でClaude Codeを立ち上げる。本体のフォルダ(main)はまったく触られないので、Claudeが大きく書き換えても気に入らなければフォルダごと捨てればきれいに元通り。短い書き方は -w(claude -w feature-x)。

Claude Codeに重い書き換えを任せたい時に、本体ブランチを汚さず別フォルダで作業させたい人向け

Claude Codeに「全ファイルの構造を作り直して」みたいな重い書き換えを任せたいけど、本体のmainを直接触らせるのは怖いとき、コマンドの後ろに名前を1つ書き足して claude --worktree refactor-cards のように叩く。叩いた瞬間に裏で別ブランチと別フォルダがセットで作られて、その中でClaudeが作業する。気に入ればmainにmergeで取り込み、気に入らなければworktreeごと削除すればmainは無事のまま。

Claude Codeに重い書き換えを任せると、本体の作業フォルダが一気に荒らされて「やっぱりさっきの方が良かった」と戻したくなる場面が出てきます。--worktree はそれを防ぐための起動時の追加スイッチで、起動と同時に「同じプロジェクトの別ブランチ用フォルダ」を裏で1つ作って、その中だけでClaudeに作業させます。

本体のフォルダはまったく触られません。気に入らなければ別フォルダごと捨てれば、main は一文字も変わらないままです。

噛み砕くと

家のリビングを片付けるとき、いきなり全部のモノを出して並べると、途中でやめたくなっても元に戻せなくなります。--worktree は「リビングはそのまま残して、別の部屋に同じ家具を仮置きして、そっちで配置を試す」やり方に近いです。

仮置き部屋で気に入った配置ができたら、リビングに反映する。気に入らなければ仮置き部屋ごと撤収する。本番のリビングは最後まで無事です。

大事な前提:このコマンドはgitで管理しているフォルダの中で叩く

--worktree の中身はgitの「worktree」機能を使っています。なのでgitで管理されていないフォルダ(git initgit clone もしていないただのフォルダ)で叩くと、何も起きずにエラーで止まります。

叩く前に、そのフォルダが .git という隠しフォルダを持っているか確認しておきます。ls -la.git が見えればOK、見えなければ git管理されていないので、先に git init するか、すでにgitで管理されている別フォルダに移動してください。

「料理ブログのHTMLを大きく書き換える実験」を例に、実際の手順を見る

料理ブログのプロジェクト ~/projects/cooking-blog があって、トップページのカード型レイアウトをClaude Codeに大きく書き換えてもらいたい場面を想定します。ただし「やってみて気に入らなければ即捨てたい」ので、main を直接触りたくありません。

ステップ1: プロジェクトのフォルダに移動する

$ cd ~/projects/cooking-blog

このフォルダはすでに git clone 済みで、.git フォルダがある状態です。

ステップ2: --worktree を付けてClaude Codeを起動する

$ claude --worktree refactor-cards

これだけで裏で3つの処理が走ります。

  • worktree-refactor-cards という名前の新しいブランチを作る
  • ~/projects/cooking-blog/.claude/worktrees/refactor-cards/ という新しいフォルダを作って、そのブランチをチェックアウトする
  • そのフォルダの中でClaude Codeを起動する

画面上はClaude Codeのいつもの画面が立ち上がりますが、作業しているフォルダがいつもと違う場所になっている、という状態です。

ステップ3: Claudeにカードレイアウトを書き換えてもらう

> トップページの index.html のカード一覧部分を、画像を上、タイトルと概要を下にした縦積みレイアウトに変えて

Claudeが index.htmlstyle.css を書き換えていきます。ここで重要なのは、書き換わっているのは .claude/worktrees/refactor-cards/ 側の index.html だけで、本来の ~/projects/cooking-blog/index.html は一文字も変わっていない、という点です。

ステップ4: 結果を確認する

別のターミナル画面を開いて、worktreeのフォルダに直接行ってブラウザで開いてみます。

$ cd ~/projects/cooking-blog/.claude/worktrees/refactor-cards
$ open index.html

もしくはVS Codeで開きます。

$ code ~/projects/cooking-blog/.claude/worktrees/refactor-cards

ここで初心者がやりがちな勘違いがあります。元のVS Codeウィンドウで本体プロジェクトを開いていても、worktreeは別フォルダ扱いなので**同じウィンドウには出てきません**。新しいウィンドウで別途開く必要があります。

ステップ5a: 気に入った場合 → 本体に取り込む

カード書き換えの結果が良ければ、Claudeに「commitして」と頼んでcommitを作ってから、Claude Codeを終了します。

> いまの変更を「リファクタ: カードレイアウトを縦積みに変更」というメッセージでcommitして

Claudeが終了するとき、変更がcommitされているのを検知して「このworktreeを残しますか?削除しますか?」と聞いてきます。本体に取り込むつもりなら**残す**を選びます。

あとは本体のフォルダに戻って、worktreeのブランチを取り込めば反映完了です。

$ cd ~/projects/cooking-blog
$ git merge worktree-refactor-cards

ステップ5b: 気に入らなかった場合 → worktreeごと捨てる

結果がイマイチなら、Claude Codeを /exit で終了します。変更を残していない(commitしていない)状態なら、worktreeとブランチが**自動で削除されます**。

commitまで作っていた場合は、Claudeが「残しますか?削除しますか?」と聞いてくるので、**削除**を選べばworktreeフォルダもブランチもまるごと消えます。本体のmainには一文字も影響していません。

つまり --worktree は何をしてくれるのか

  • やってくれる: 起動と同時に「実験用の別フォルダ+別ブランチ」を裏で1セット作って、そこでClaudeに作業させる
  • やってくれる: 終了時、変更が無ければworktreeを自動で片付ける。変更があれば「残すか削除か」を聞いてくる
  • やってくれない: 元のブランチで作業途中だった未保存の変更を、新しいworktreeに持っていく(worktreeは新しい枝の新しいフォルダなので、そっちには来ない)
  • やってくれない: gitで管理していないフォルダで叩いた時のエラー回避。git init 済みであることが前提
  • 意味が薄い場面: もともと小さい変更(1ファイル数行の修正)。普通にmainで作業して気に入らなければ git checkout . で戻すほうが速い

使いどころ3シナリオ(具体題材で再現)

シナリオ1: 料理ブログのデザインを大きく作り直したいとき

個人運営の料理ブログで「カード型のレイアウトを記事一覧に変えたい」みたいに、CSS含め30〜50ファイル単位で書き換わる実験をするケース。本体のmainに直接書かせると、気に入らなかったときの戻しが面倒です。claude --worktree redesign-cards で起動して、その中で全部やらせて、気に入ればmerge、ダメなら捨てる、で安全に試せます。

シナリオ2: 家計簿アプリで、別案を2つ並行で試したいとき

家計簿アプリの「カテゴリ自動分類」を、ルールベース版とAI判定版の2案で比べたい場面。ターミナルを2つ開いて、それぞれで claude --worktree rules-versionclaude --worktree ai-version を叩けば、別フォルダで完全に独立した2つのClaude Codeセッションが動きます。お互いの作業がぶつかりません。

シナリオ3: GitHubから落としてきたばかりのOSSを安全にいじりたいとき

git clone したばかりの他人のプロジェクトに「ここの挙動だけ変えてみたい」というとき。そのままmainで触ると、後から本家の更新を取り込みたくなった時に競合します。claude --worktree my-experiment で起動すれば、自分の実験ブランチ専用のフォルダが切られるので、mainは本家の更新を素直に受け取れる状態のまま残せます。

初心者が踏みやすい落とし穴

  • gitで管理していないフォルダで叩くと動かない.git フォルダが無い状態で叩くとエラーになります。先に git init するか、git管理済みのフォルダに移動してから起動してください
  • 同じ名前のworktreeがすでにあるとエラーになるclaude --worktree refactor-cards を叩いた後、もう一度同じ名前で叩くと「すでに存在する」と怒られます。前のworktreeを使い終わって削除してから同じ名前を使うか、別の名前を付けます
  • 元のブランチで書きかけのファイルは持っていけない。worktreeは別フォルダの別ブランチなので、本体のmainで未保存(commitしていない)のファイルがあっても、新しいworktreeには反映されません。先にcommitするか、捨ててから --worktree を切ります
  • VS Code等のエディタは別ウィンドウで開く必要がある。本体のフォルダを開いていたウィンドウに、worktreeのフォルダは表示されません。新しいウィンドウで code <worktreeパス> として開きます
  • .env.env.local はworktreeにコピーされない。これらはgitの管理対象外なので、新しいworktreeフォルダには存在しません。アプリ起動時に環境設定ファイルが必要なプロジェクトは、プロジェクトのルートに .worktreeinclude ファイルを作って、コピー対象を列挙しておきます(中身は .env.env.local 等を1行ずつ書く)
  • worktreeを削除した後は復元できない。終了時のプロンプトで「削除」を選んだ瞬間、worktreeフォルダもブランチも消えます。後から「やっぱり使いたかった」となっても戻せないので、迷ったら一旦「残す」を選んでおいて、後でゆっくり判断するのが安全です
  • 本体の .gitignore.claude/worktrees/ を入れておく。入れておかないと、本体側で git status したときにworktreeフォルダの中身が「未追跡ファイル」として大量に出てきて見づらくなります
  • 1ファイル数行の修正には大げさ--worktree を切るのは「もし失敗したら丸ごと捨てたい」ような大きい実験向けです。タイポ修正・文言調整みたいな小さい変更なら、普通にmainで作業して、気に入らなければ git checkout . で戻すほうが手数が少ないです

書き方

claude --worktree <名前>
claude -w <名前>          (短い書き方、機能は同じ)
claude --worktree         (名前を省くと bright-running-fox 風の名前を自動で付けてくれる)

やってみるとこうなる

入力

$ cd ~/projects/cooking-blog
$ claude --worktree refactor-cards

出力例

(ターミナルで)
  Created worktree at .claude/worktrees/refactor-cards/
  Branch: worktree-refactor-cards (from origin/main)
  Starting Claude Code in worktree...

(Claude Codeのいつもの画面が立ち上がる。ただし作業フォルダは
~/projects/cooking-blog/.claude/worktrees/refactor-cards/ になっている)

>

このページに出てきた言葉

git
ファイルの変更履歴を管理する仕組み。「いつ」「誰が」「どのファイルを」「どう変えたか」を全部記録して、過去の状態に戻せる
ブランチ
プロジェクトの「作業の枝分かれ」。同じファイル一式に対して別の変更履歴を持てる
main
多くのプロジェクトで「本番として残す枝」の名前。昔は master と呼ばれていた
git worktree
gitの機能の1つで、同じプロジェクトの中に「別ブランチ用の作業フォルダ」を追加で作れるもの
git init
そのフォルダを「これからgitで管理する」と宣言する操作
git clone
GitHub等にあるプロジェクト一式を、自分のパソコンにコピーしてくる操作
commit
いまの変更を「ここまで保存」と区切ってgitに記録する操作。スナップショットを撮るイメージ
merge
あるブランチで作った変更を、別のブランチに取り込む操作
チェックアウト
指定したブランチの状態にフォルダの中身を切り替える操作
競合(コンフリクト)
同じファイルの同じ場所が2つの別の変更で書き換わっていて、gitがどっちを残すか自動で決められない状態
.worktreeinclude
プロジェクトのルートに置くテキストファイル。worktree作成時に元フォルダからコピーしてほしいファイル(.env等)を1行ずつ書いておくと、新しいworktreeに自動でコピーされる
OSS
オープンソースソフトウェアの略。コードがGitHub等で公開されていて、誰でも自由に読んだり改変したりできるソフト

関連項目

公式ドキュメント

https://code.claude.com/docs/en/cli-reference

-

← 戻る