1748 字
9 分鐘

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:

Terminal window
git status --short
git worktree add ../zeroone-agent-auth -b agent/auth main

建立成功後,agent 應該只在新目錄裡工作:

Terminal window
cd ../zeroone-agent-auth
git status --short
git branch --show-current

另一個任務使用不同路徑與分支:

Terminal window
git worktree add ../zeroone-agent-tests -b agent/tests main

分支名稱不是安全邊界,但明確命名能讓 agent handoff、PR 與清理紀錄更容易對上。不要讓兩個 agent 共用同一個工作目錄,也不要讓它們同時 checkout 同一個 branch;Git 會阻止部分重複 checkout,但工作流不應把這個阻擋當成協調機制。

先列出所有工作目錄,再交給 agent#

在任何 agent 開始前,從主要 repository 執行:

Terminal window
git worktree list --porcelain

--porcelain 適合保存到 log 或交給腳本解析。每個工作目錄至少確認三件事:路徑、目前 branch、HEAD。交接任務時可把這些資訊和任務說明放在一起:

工作目錄:../zeroone-agent-auth
分支:agent/auth
任務:只修改登入流程與測試,完成後執行 pnpm check
完成條件:列出變更檔案、測試輸出與尚未處理的風險

這種完成條件和 AI coding agent 的可驗證完成狀態 是同一個原則:agent 不只要說「完成」,還要留下可以檢查的檔案、指令與結果。

合併前先在各自目錄檢查#

agent 完成後,不要直接在主要工作目錄猜哪些檔案可以合併。先在 agent worktree 留下可重現的檢查:

Terminal window
git status --short
git diff --stat
git diff --check

如果 worktree 裡有未追蹤檔案,先確認它們是否屬於任務。不要讓 agent 為了「清空狀態」直接刪除未知檔案;要嘛加入正確的 commit,要嘛把未完成原因交給下一個人。

回到主要工作目錄後,先更新基準 branch,再合併 agent branch:

Terminal window
cd ../ZeroOne
git switch main
git pull --ff-only
git merge --no-ff agent/auth

如果 merge 有衝突,先停下來標記衝突檔與決策,不要讓另一個 agent 在同一個 worktree 裡繼續覆寫。多個 agent 的價值是把工作檔案分開,不是消除設計衝突或 review。

完成後安全移除與 prune#

合併並確認 branch 不再需要後,先移除 linked worktree,再刪除已合併的 branch:

Terminal window
git worktree remove ../zeroone-agent-auth
git branch -d agent/auth
git worktree prune --dry-run
git worktree prune

git worktree remove 會針對工作目錄執行 Git 的清理檢查;若裡面還有未提交的工作,先保存或交接,不要習慣性加上 --forceprune --dry-run 可以先查看 Git 認為已遺失的 metadata,確認後才執行真正的 prune。

若工作目錄曾被手動搬到別的路徑,先用 git worktree repair 修復連結,再判斷是否要移除:

Terminal window
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 --porcelaingit status 驗證,合併前保存 diff 與測試結果,完成後用 worktree removeprune 清理。它能降低 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/容器邊界。

參考資料:

Git 官方文件:git-worktree

Git 官方文件:git-worktree add

Git 官方文件:git-worktree prune

Git worktree 怎麼用?隔離多個 AI coding agent 的工作目錄
https://laplusda.com/posts/git-worktree-ai-coding-agent-workflow/
作者
Zero
發佈於
2026-08-24
許可協議
CC BY-NC-SA 4.0
這篇文章有幫助嗎?

回報錯字、失效連結,或告訴我你想看的延伸主題。