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 がやること(あなたは見ているだけ)。
git statusで変更を確認し、.gitignoreと照らして秘密情報を外す- 意味のあるメッセージでコミット
- worktree のブランチを main のチェックアウトへ取り込む
- 取り込めたと報告する(衝突や未コミットがあれば知らせる)
報告が来たら、①コミットされたか ②main に取り込まれたか ③秘密情報(.env.local 等)が除外されたかの3点だけ確認します。問題なければ、あなたがやるのはカードを閉じることだけ。コミット済み=変更が残っていないので、TinyAgentDeck が worktree を自動で削除し、残った tad/session-… ブランチも「孤児 worktree」セクションからワンクリックで消せます。
worktree 内の Claude は、自分が今いる worktree やチェックアウト中のブランチ自身は削除できません(git が「使用中」として拒否します)。だから物理的な後始末はアプリの担当です。Claude の役目は「コミット → 取り込み → 報告」まで。そこから先はカードを閉じるだけで完結します。
毎回頼みたくない — セッション開始時の「最初の指示」に「作業が終わったらコミットして main に取り込んで」と書いておけば、最後に自動でやってくれます。
GitHub にも残したい — 依頼文に「取り込めたら git push origin main もして」を足します。main に取り込んでもリモートにはまだ push されていないので、バックアップ・履歴共有のために残すなら付けてください(本番がデプロイ済みなら push なしでもサイトは動きます)。
PR で運用している — main に直接入れず、「コミットして push、PR を作って」と頼めば Claude がそうします。
自分で操作したいとき — 手動コマンド
中で何が起きているかを知りたい、または手で確認しながら進めたい場合は次の3ステップです。Claude に任せるなら読み飛ばして構いません。
worktree の中でコミットする
作業をしたセッションのターミナルで実行します。
git status # 何が変わったか確認(秘密情報が混じっていないか見る)
git add -A
git commit -m "わかりやすいメッセージ"
git branch --show-current # → tad/session-… を控える(次で使う)
main に取り込む
普段の作業フォルダ(worktree ではない、main をチェックアウトしている方)のターミナルで、ステップ1で控えたブランチ名をマージします。
git merge tad/session-…
本番に既に同じ内容が出ている場合でも、この後デプロイスクリプトを再実行して結果は変わりません(冪等)。これで main と本番が一致します。
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-*' で確認できます。