Git worktree 怎麼用?隔離多個 AI coding agent 的工作目錄
當兩個 AI coding agent 同時在同一個資料夾工作,最先出問題的通常不是 Git merge,而是工作中的檔案互相覆蓋:一個 agent 正在改測試,另一個 agent 可能把同一個檔案重寫;等到最後才看 diff,已經很難知道哪個結果來自哪個任務。
Git 官方的 worktree 可以讓同一個 repository 同時擁有多個工作目錄。每個工作目錄可以檢出不同分支,適合把「功能、測試、文件或排錯」交給不同 agent,各自完成後再回到主工作目錄整合。這篇只處理 Git 工作目錄隔離,不把它誤當成完整的容器或 secrets 隔離。
worktree 和 clone、branch 差在哪裡
branch 是版本線;worktree 是讓多個版本線同時有實體工作目錄;clone 則是另一份 repository。對多個 agent 的工作流來說,可以先用這張表判斷:
| 方法 | 解決的問題 | 仍要另外處理的事 |
|---|---|---|
| 多個 branch、同一個資料夾 | 保存不同版本線 | 同一時間只能操作一個 checkout,agent 仍會共用檔案 |
git worktree | 同一 repository 的多個獨立檔案目錄 | port、資料庫、.env、Docker volume 仍可能共用 |
| 多個 clone | 完全分開的 repository 目錄 | 佔用更多管理空間,分支與物件同步要另行維護 |
Git 會管理 linked worktree 的 metadata,因此不要手動刪除 .git/worktrees/ 下的內容來「清理」工作目錄。建立、移動、移除與修復都應透過 git worktree 指令完成。
建立一個 agent 專用工作目錄
先在主要 repository 確認目前沒有未預期的修改,再用一個新的路徑和新分支建立工作目錄。下面的 ../zeroone-agent-auth 只是示例,main 要換成你實際要作為基準的 branch:
git status --shortgit worktree add ../zeroone-agent-auth -b agent/auth main建立成功後,agent 應該只在新目錄裡工作:
cd ../zeroone-agent-authgit status --shortgit branch --show-current另一個任務使用不同路徑與分支:
git worktree add ../zeroone-agent-tests -b agent/tests main分支名稱不是安全邊界,但明確命名能讓 agent handoff、PR 與清理紀錄更容易對上。不要讓兩個 agent 共用同一個工作目錄,也不要讓它們同時 checkout 同一個 branch;Git 會阻止部分重複 checkout,但工作流不應把這個阻擋當成協調機制。
先列出所有工作目錄,再交給 agent
在任何 agent 開始前,從主要 repository 執行:
git worktree list --porcelain--porcelain 適合保存到 log 或交給腳本解析。每個工作目錄至少確認三件事:路徑、目前 branch、HEAD。交接任務時可把這些資訊和任務說明放在一起:
工作目錄:../zeroone-agent-auth分支:agent/auth任務:只修改登入流程與測試,完成後執行 pnpm check完成條件:列出變更檔案、測試輸出與尚未處理的風險這種完成條件和 AI coding agent 的可驗證完成狀態 是同一個原則:agent 不只要說「完成」,還要留下可以檢查的檔案、指令與結果。
合併前先在各自目錄檢查
agent 完成後,不要直接在主要工作目錄猜哪些檔案可以合併。先在 agent worktree 留下可重現的檢查:
git status --shortgit diff --statgit diff --check如果 worktree 裡有未追蹤檔案,先確認它們是否屬於任務。不要讓 agent 為了「清空狀態」直接刪除未知檔案;要嘛加入正確的 commit,要嘛把未完成原因交給下一個人。
回到主要工作目錄後,先更新基準 branch,再合併 agent branch:
cd ../ZeroOnegit switch maingit pull --ff-onlygit merge --no-ff agent/auth如果 merge 有衝突,先停下來標記衝突檔與決策,不要讓另一個 agent 在同一個 worktree 裡繼續覆寫。多個 agent 的價值是把工作檔案分開,不是消除設計衝突或 review。
完成後安全移除與 prune
合併並確認 branch 不再需要後,先移除 linked worktree,再刪除已合併的 branch:
git worktree remove ../zeroone-agent-authgit branch -d agent/authgit worktree prune --dry-rungit worktree prunegit worktree remove 會針對工作目錄執行 Git 的清理檢查;若裡面還有未提交的工作,先保存或交接,不要習慣性加上 --force。prune --dry-run 可以先查看 Git 認為已遺失的 metadata,確認後才執行真正的 prune。
若工作目錄曾被手動搬到別的路徑,先用 git worktree repair 修復連結,再判斷是否要移除:
git worktree repair ../zeroone-agent-auth這些命令處理的是 Git metadata,不會替你清理 agent 產生的外部服務、Docker volume、暫存資料或 secrets。那些資源要依專案自己的生命週期另外回收。
worktree 不會隔離哪些東西
這是多 agent 工作流最容易被誤解的邊界。worktree 會把不同 branch 的檔案狀態分開,但下面這些資源可能仍然共用:
.env、shell 環境變數、SSH agent 與登入憑證。- 固定的 localhost port、共用的 Docker Compose project name 與 named volume。
- 同一個本機資料庫、測試 bucket、queue 或外部 API 帳號。
- 工作目錄之外的快取、全域套件與 editor 設定。
因此讓 agent 同時跑測試時,為每個 worktree 分配不同 port、測試資料庫或 Compose project name;敏感資料則使用最小範圍的測試 secret。若任務需要真正的檔案系統或網路隔離,應再加上容器、sandbox 或不同帳號,不能只靠 git worktree。
結論:一個任務、一個 worktree、一個完成證據
Git worktree 最適合處理「同一 repository 同時有多個分支工作」的檔案隔離問題。建立時分配獨立路徑與 branch,交接前用 git worktree list --porcelain 和 git status 驗證,合併前保存 diff 與測試結果,完成後用 worktree remove 和 prune 清理。它能降低 agent 互相覆蓋檔案的風險,但不會替你隔離 port、資料庫或 secrets;那些邊界要在工作流中明確寫出來。
常見問題
Q: git worktree 會複製一份完整 repository 嗎?
A: 它建立另一個工作目錄,並由 Git 管理 linked worktree 的 metadata;它和獨立 git clone 的管理方式不同。實際檔案、物件與 checkout 行為仍要以你的 Git 版本與 repository 設定驗證,不要手動改 .git/worktrees/。
Q: 兩個 AI agent 可以使用同一個 branch 嗎?
A: 不要把同一個 branch 同時分配給兩個工作目錄。就算 Git 在部分情況會阻止重複 checkout,兩個 agent 仍然沒有清楚的變更所有權;應該各自建立 branch,完成後再由人或受控流程合併。
Q: worktree 能防止 agent 讀到正式環境 secrets 嗎?
A: 不能。它主要隔離 Git checkout 與檔案狀態;shell 環境、.env、Docker volume、資料庫和外部 API 仍可能共用。需要 secrets 或網路隔離時,請使用專用測試憑證與更強的 sandbox/容器邊界。
參考資料:
回報錯字、失效連結,或告訴我你想看的延伸主題。