Git Worktree 隔離機制:Claude Squad 讓多個代理人不互相干擾的關鍵

Git Worktree 隔離機制:Claude Squad 讓多個代理人不互相干擾的關鍵

6 min read

你讓兩個代理人同時工作,一個在加新功能,一個在修 bug——如果它們都在同一個工作目錄裡改同一份程式碼,會發生什麼事?

最好的情況:git 衝突,你要手動解。最壞的情況:一個代理人的改動直接覆蓋了另一個的,你甚至不知道發生了什麼。

Claude Squad 用 git worktree 解決這個問題。這篇說清楚它怎麼運作。

Git Worktree 是什麼

通常你的 git repo 只有一個工作目錄——你在 ~/projects/my-app 這個資料夾裡工作,checkout 到哪個 branch,那個資料夾的檔案就變成那個 branch 的內容。

git worktree 是一個鮮為人知的 git 功能,讓你同時在多個目錄裡 checkout 不同的 branch。每個目錄都是真實的工作目錄,有自己的 branch,修改不會互相影響。

舉個例子:

# 主要工作目錄(main branch)
~/projects/my-app/
 
# 額外的 worktree(feature/auth branch)
~/projects/my-app--feature-auth/
 
# 另一個 worktree(bugfix/login branch)
~/projects/my-app--bugfix-login/

這三個目錄指向同一個 git repo,但各自 checkout 不同的 branch,互相完全隔離。

Claude Squad 如何使用 Worktree

每次你在 Claude Squad 建立一個新 session,它在背景做了這幾件事:

  1. 從你目前的 branch 建立一個新 branch(名稱自動生成,包含時間戳)
  2. 在這個新 branch 上建立一個 git worktree,放在主要工作目錄的旁邊
  3. 在那個 worktree 目錄裡啟動 tmux session
  4. 在 tmux session 裡跑你設定的 AI 代理人

代理人的所有操作——讀檔案、改程式碼、建立新檔案——都發生在那個獨立的 worktree 目錄裡。它看不到也碰不到其他 session 的工作目錄。

實際長什麼樣

假設你的 repo 在 ~/projects/my-app,你建立了兩個 Claude Squad session:

~/projects/
├── my-app/                    ← 你的主要工作目錄(main branch)
├── my-app--claude-squad-1/    ← Session 1 的 worktree(cs/task-abc123 branch)
└── my-app--claude-squad-2/    ← Session 2 的 worktree(cs/task-def456 branch)

每個 claude-squad-N 目錄都是完整的、可以直接用的工作目錄——你可以 cd 進去看,所有檔案都在,跑 git log 會看到這個 branch 的 commit 歷史。

查看 Worktree 狀態

如果你想看目前有哪些 worktree,在任何一個 worktree 目錄裡跑:

git worktree list

輸出大概長這樣:

/Users/you/projects/my-app            abc1234 [main]
/Users/you/projects/my-app--cs-1      def5678 [cs/task-feature-readme]
/Users/you/projects/my-app--cs-2      ghi9012 [cs/task-fix-login-bug]

第一欄是路徑,第二欄是目前的 commit hash,第三欄是 branch 名稱。

Session 刪除時 Worktree 也跟著清掉

在 Claude Squad TUI 裡按 D 刪除一個 session,Claude Squad 會:

  1. 終止 tmux session
  2. 移除對應的 git worktree
  3. 從 worktree 清單裡移除那個 branch

你不需要自己手動清。但如果 Claude Squad 異常關閉導致 worktree 沒清乾淨,可以手動清理:

git worktree prune

這個指令會清掉所有已經不存在的 worktree 記錄。

把代理人的改動帶回主 Branch

代理人在 worktree 裡跑完了,它的改動在它自己的 branch 上。你要把這些改動帶回主 branch,有幾種方式:

方式一:直接在 Claude Squad 裡 push(推薦)

在 TUI 裡選中那個 session,按 s push 到 GitHub,然後在 GitHub 上開 PR 合併。這是最乾淨的流程,也最容易追蹤。

方式二:在本地 merge

# 確認你在主 branch
git checkout main
 
# Merge 那個 session 的 branch
git merge cs/task-feature-readme

方式三:Cherry-pick 特定 commit

如果那個 session 的 branch 有好幾個 commit,你只想要其中幾個:

git cherry-pick <commit-hash>

為什麼這個設計比「多開終端機」好

多開終端機,多個代理人共享同一個工作目錄——任何時候代理人 A 和代理人 B 修改同一個檔案,就是衝突。你沒辦法讓兩個代理人「同時」安全地工作在同一份程式碼上。

Worktree 設計讓「同時工作」變成真正安全的事:每個代理人有自己的 branch、自己的工作目錄、自己的 commit 歷史。你最後做的是 code review 和 merge,而不是修衝突。

這不只是效率問題——這是能不能並行工作的根本差異。


理解了 worktree 隔離之後,下一個值得搞清楚的是 auto-accept 模式——讓代理人在背景跑,你去做別的事,它把任務跑完再通知你。

上一篇:TUI 基本操作:學會那幾個快捷鍵,你就上手了 下一篇:Auto-Accept 模式:讓代理人跑在背景,你去做別的事