worktree とは

git worktree は、ひとつのリポジトリを「別のフォルダ+別のブランチ」として同時に開く git の機能です。普段の作業フォルダはそのまま、もう一つ独立した作業場をその場に増やせます。

TinyAgentDeck でセッションを始めるとき「独立 worktree で作成」トグルを ON にすると、そのセッション専用の作業フォルダと、専用ブランチ tad/session-<セッションID> が自動で作られ、そこで claude が起動します。これにより、同じリポジトリで複数のエージェントを同時に走らせてもファイルが衝突しません

いつ使う?

同じリポジトリで2つ以上のセッションを並行させるときに ON。別プロジェクトや単発の作業なら OFF(プロジェクトのフォルダで直接起動)で十分です。

セッションを worktree で始める

プロジェクトダッシュボードの「セッションを開始」で「独立 worktree で作成」を ON にすると、TinyAgentDeck が裏側で次を行います。

  • worktree をアプリ管理フォルダ(~/Library/Application Support/…/worktrees/ 配下)に作成 — リポジトリ近傍を汚しません
  • 専用ブランチ tad/session-<セッションID> を切る
  • その worktree フォルダをカレントに claude を起動

あなたの普段の作業フォルダ(main をチェックアウトしている方)は一切触られません。worktree は、終わったら畳める「隔離された並行作業場」です。

作業が終わったら

worktree の中で行った変更は、そのセッションのブランチの上にあるだけで、まだ main にも、普段の作業フォルダにも入っていません。だから片付ける前に「取り込む」のがコツです。

先に知っておくこと

コミットしていない変更は、worktree を削除すると消えます。たとえデプロイスクリプトで本番に出していても、git の履歴には残りません。次に main 側から本番へ反映したときに、変更が巻き戻る危険があります。

だから順番はいつも コミット → main へ統合 → 片付け です。

いちばん簡単な方法 — Claude に任せる

worktree セッションのターミナルには、いつもの Claude Code がいます。Git コマンドを自分で打つ必要はありません。作業が終わったら、そのまま日本語で頼むだけです。

例(このまま貼って使えます)。

この worktree の変更を全部コミットして、main ブランチに取り込んでおいて。
.env.local など秘密情報を含むファイルはコミットしないこと。
取り込み終わったら教えて。

Claude がやること(あなたは見ているだけ)。

  1. git status で変更を確認し、.gitignore と照らして秘密情報を外す
  2. 意味のあるメッセージでコミット
  3. worktree のブランチを main のチェックアウトへ取り込む
  4. 取り込めたと報告する(衝突や未コミットがあれば知らせる)

報告が来たら、①コミットされたか ②main に取り込まれたか ③秘密情報(.env.local 等)が除外されたかの3点だけ確認します。問題なければ、あなたがやるのはカードを閉じることだけ。コミット済み=変更が残っていないので、TinyAgentDeck が worktree を自動で削除し、残った tad/session-… ブランチも「孤児 worktree」セクションからワンクリックで消せます。

なぜ Claude に片付けまで頼まないのか

worktree 内の Claude は、自分が今いる worktree やチェックアウト中のブランチ自身は削除できません(git が「使用中」として拒否します)。だから物理的な後始末はアプリの担当です。Claude の役目は「コミット → 取り込み → 報告」まで。そこから先はカードを閉じるだけで完結します。

頼み方のバリエーション

毎回頼みたくない — セッション開始時の「最初の指示」に「作業が終わったらコミットして main に取り込んで」と書いておけば、最後に自動でやってくれます。

GitHub にも残したい — 依頼文に「取り込めたら git push origin main もして」を足します。main に取り込んでもリモートにはまだ push されていないので、バックアップ・履歴共有のために残すなら付けてください(本番がデプロイ済みなら push なしでもサイトは動きます)。

PR で運用している — main に直接入れず、「コミットして push、PR を作って」と頼めば Claude がそうします。

自分で操作したいとき — 手動コマンド

中で何が起きているかを知りたい、または手で確認しながら進めたい場合は次の3ステップです。Claude に任せるなら読み飛ばして構いません。

1

worktree の中でコミットする

作業をしたセッションのターミナルで実行します。

git status                  # 何が変わったか確認(秘密情報が混じっていないか見る)
git add -A
git commit -m "わかりやすいメッセージ"
git branch --show-current   # → tad/session-… を控える(次で使う)
2

main に取り込む

普段の作業フォルダ(worktree ではない、main をチェックアウトしている方)のターミナルで、ステップ1で控えたブランチ名をマージします。

git merge tad/session-…

本番に既に同じ内容が出ている場合でも、この後デプロイスクリプトを再実行して結果は変わりません(冪等)。これで main と本番が一致します。

3

worktree を片付ける

TinyAgentDeck のカードを閉じるだけです。ステップ1でコミット済み=変更が残っていない状態なので、アプリが自動で worktree を削除します。

残った tad/session-… ブランチはステップ2でマージ済み=不要です。プロジェクトダッシュボードの「孤児 worktree」セクションで「ブランチも削除」を選ぶか、手動で消せます。

git branch -d tad/session-…   # マージ済みブランチを削除

秘密情報をコミットしない

.env.local や API キー・シークレットを含むファイルは、絶対にコミットしません.gitignore に入っていれば git status には出ません(出てくる場合は git add しないでください)。

worktree 側にだけ書いた環境変数は main 側のフォルダには存在しません。ローカルで動作確認したいときだけ、main 側の .env.local にも同じ値を足してください。本番用のシークレットは Cloudflare などの環境変数で別管理なので、この作業の影響は受けません。

コミットせずに捨てたいとき

「本番に出ていて、コードも履歴も要らない」というレアケースでは、コミットせずにカードを閉じ、確認ダイアログで強制削除を選べば本番はそのまま動きます。ただし変更は git に一切残らないため、基本的には非推奨です。

孤児 worktree の掃除

アプリの外で作られたり、何らかの理由で残ってしまった worktree は「孤児 worktree」としてプロジェクトダッシュボードに一覧されます。ここから削除でき、「ブランチも削除」を ON にすると worktree を消したあとにブランチも削除します(不可逆な操作なので確認が入ります)。

よくある質問

コミットや main への取り込みも Claude にやらせて大丈夫ですか?

はい。それがいちばん簡単な方法です。worktree セッションのターミナルで上の依頼文をそのまま貼ってください。秘密情報の除外も含めて Claude が判断し、結果を報告します。Git を普段から Claude に任せている人は、これまでと何も変わりません。

worktree を消したらブランチも消えますか?

いいえ。worktree の削除とブランチの削除は別です。マージ済みなら git branch -d <名前>、未マージを強制的に消すなら git branch -D <名前>

main に取り込むのを忘れて片付けてしまいました。

コミット済みであれば、ブランチは残っているのでいつでも git merge tad/session-… で取り込めます。ブランチ名は worktree のフォルダ名(セッションID)から tad/session-<セッションID> の形で決まります。

ブランチ名が分かりません。

worktree のターミナルで git branch --show-current、またはリポジトリで git worktree list / git branch --list 'tad/session-*' で確認できます。

TinyAgentDeck を入手

worktree の分離は内蔵。セッションを並行で走らせて、終わったら畳むだけ。

無料トライアルをダウンロード