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 init も git 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.html や style.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-version と claude --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等で公開されていて、誰でも自由に読んだり改変したりできるソフト