メインコンテンツへスキップ

並行作業を混ぜない(worktree)

  • レッスン 2
  • 12分

このレッスンで

終わる頃には、次ができるようになります

  • 同じ作業フォルダで複数の作業が混ざる事故のパターンを説明できる
  • Claude Codeの--worktreeフラグで独立した作業場所を作り、終わったら片付けられる
  • サブエージェントをworktreeで分離する設定と、チームで決めておくべきルールを説明できる

同時に触ったら、片方の変更が消えていた

あるチームでのことです。メンバーAが「トップページの見出しを直して」とClaude Codeに頼みました。ほぼ同じタイミングで、メンバーBが同じリポジトリの同じフォルダで「フッターにリンクを追加して」と頼みました。

数分後、Aの変更がフッターの修正に上書きされて消えていました。二人とも同じ作業フォルダ、同じブランチを見ていたからです。

これは特別な事故ではありません。同じ作業フォルダを複数の人・複数のセッションが同時に触れば、必ず起きることです。ブランチを知っているだけでは防げません。ブランチは「どの変更を記録するか」を分けるものであって、今ディスク上にあるファイルそのものを分けてはくれないからです。


同じフォルダに二人が入ると何が起きるか

作業フォルダの分け方

通常の作業フォルダ

フォルダは1つ。誰かがブランチを切り替えると、そこにあるファイルが丸ごと入れ替わる。別のメンバーが同時に別の作業をしていれば、保存前の変更がそのまま置き換わってしまう。

worktree

同じリポジトリから、もう1つ作業フォルダを作る。ブランチも中身のファイルも別。片方をどう触っても、もう片方には影響しない。

ブランチだけでは、ディスク上のファイルは1つのまま。worktreeはファイルそのものを複製する

worktreeはGit本体が持つ機能で、Claude Code固有のものではありません。自分で作ることもできます。

Terminal
$

git worktree add ../project-feature-a -b feature-a

Preparing worktree (new branch 'feature-a')

これで ../project-feature-a という、元とは別の作業フォルダができます。ここでClaude Codeを起動すれば、プラグインや権限の承認、.claude/skills の読み込みも普段どおりに使えて、元のフォルダとは完全に独立して動きます。使い終わったら消します。

Terminal
$git worktree remove ../project-feature-a

Claude Codeの--worktreeフラグで作業場所を分ける

自分でフォルダを作らなくても、Claude Code起動時に名前を渡すだけで同じことができます。

Terminal
$claude --worktree feature-a

--worktree(短縮形 -w)に名前を渡すと、独立したworktreeを作ってその中でClaude Codeを起動してくれます。既定では、リポジトリ直下の .claude/worktrees/feature-a/ に、worktree-feature-a という新しいブランチで作られます。

名前は省略してもかまいません。省略すると bright-running-fox のような名前が自動でつきます。

Terminal
$claude --worktree

同じ会話の途中で「worktreeで作業して」と頼んでも、EnterWorktree というツールが同じことをしてくれます。ただしv2.1.206以降、.claude/worktrees/ の外に入ろうとする場合は承認が必須です。「今後は聞かない」を選んでも省略されず、bypassPermissions モードのときだけ承認が省かれます。

このひと続きの流れを図にすると、次のようになります。

worktreeで作業する一連の流れ

01

作る

claude --worktree <名前> で起動

02

そこで作業する

元のフォルダとは独立。他の人の作業に触れない

03

終了する

変更なしなら自動で片付く

04

続きから再開する

変更が残っていれば、再開コマンドが表示される

作って、そこで作業して、終わったら片付ける。ここまでが1セット

サブエージェントをworktreeで分離する

チームの .claude/agents/ に置いたサブエージェント定義にも、worktree隔離を設定できます。frontmatterに isolation: worktree を書くだけです。

---
name: refactorer
description: Applies mechanical refactors across many files
isolation: worktree
---

Apply the requested refactor across every affected file, then run the tests
and report the results.
指定なし(既定)

親の会話と同じ作業フォルダを共有する。同時に別の作業を頼むとファイルが競合しうる

isolation: worktree

一時的な独立コピーの中で動く。既定ではリポジトリのdefault branchから分岐し、変更が無ければ終了時に自動で片付く

isolation: worktreeを付けたときの違い

「今動いている会話の続きから分岐させたい」場合は、設定で worktree.baseRef を "head" にすると、default branchではなく親セッションの現在のHEADから分岐します。機械的な一括修正のような、時間のかかる作業をサブエージェントに任せるとき、この隔離があるとメインの会話のブランチを汚さずに済みます。


終わったら片付ける

Claude Codeを --worktree で起動したセッションを終えるとき、何が起きるかは中身次第です。

変更なしで終える

名前を付けなかったセッションなら、worktreeとブランチをClaude Codeが自動で片付ける

変更が残っている

維持するか消すか聞かれる。維持を選ぶと、再開用のコマンド claude --worktree <名前> --resume が表示される

セッションを終えるとき

手で作ったworktreeは、git worktree remove ../project-feature-a で自分で消します。

注意

.gitignoreに1行足しておく

.claude/worktrees/ を .gitignore に足しておきましょう。足しておかないと、worktreeの中身が「追跡されていないファイル」として元の作業フォルダのgit statusに表示され続けます。


チームのルールにする

ここまでの仕組みを、チームの運用ルールに落とし込みます。

名前付けのルール

時間のかかる作業や複数ファイルにまたがる作業は、名前付きworktreeで区別する。名前を見れば誰が何をしているか分かるようにしておく

同時編集の禁止

同じworktreeを二人で同時に使わない。worktreeを分けても、その中でさらに同時編集すれば同じ事故が起きる

承認の仕組みの共有

Claudeに「worktreeで作業して」と頼むと自動で作られること、.claude/worktrees/の外は承認が必要なことを、チームで共有しておく

Agent teamsの扱い

複数のClaudeが1つの会話でチームを組む実験的機能を使う場合、teammate同士はworktreeで分離されないため、ファイル単位で担当を分けておく

チームで決めておくこと

worktreeは「同じリポジトリの中に、もう1つ独立した作業場所を作る」という一点だけ覚えておけば、あとは名前を付けて起動し、終わったら片付けるだけです。


今日のまとめ

  • 同じ作業フォルダを複数の人・セッションが同時に触ると、片方の変更が消える
  • claude --worktree <名前> で独立した作業場所を作り、終わったら自動または手動で片付く
  • サブエージェントには isolation: worktree を付けると、一括修正のような作業をメインのブランチから隔離できる

次のレッスンでは、GitHubにClaudeを常駐させて、リポジトリの中からClaudeを呼び出す方法を見ていきます。GitHubにClaudeを置くを見ていきましょう。

セルフチェック

1. worktreeとは何ですか?

2. Claude Codeで名前付きのworktreeを作って起動するには?

3. 変更が残ったままworktreeのセッションを終えると、どうなりますか?

SourceDOCUMENTATION
Claude Code: Worktrees

--worktreeフラグの詳しい仕様、EnterWorktreeツール、サブエージェントの隔離設定まで載っている公式ドキュメント。

Webcode.claude.com
code.claude.com/docs/en/worktrees
SourceDOCUMENTATION
Claude Code: Sub-agents

サブエージェント定義のfrontmatter一覧。isolation フィールドの仕様もここにある。

Webcode.claude.com
code.claude.com/docs/en/sub-agents

このレッスンは役に立ちましたか?