你有沒有遇過這種情況?正在開發一個複雜的新功能,程式碼寫到一半,突然接到緊急 Bug 需要立刻修復。
為了切換分支,你只好心不甘情不願地執行 git stash 藏起半成品的程式碼。修完 Bug 切回來後,還要小心翼翼地 git stash pop,甚至有時候還會遇到程式碼衝突的惡夢。
其實 Git 早就有一個超強的工具能解決這個痛點,那就是 Git Worktree。
告別混亂的切換與 Stash,用 Worktree 開啟多線程開發
這篇文章帶你一次搞懂它的核心運作與實戰用法。
Git Worktree 與 Git Branch 有什麼不同?
要搞懂 Git Worktree,我們先釐清它和 Git Branch 的差別。
我們可以把版本控制想像成在讀一本書:
Commit是 書本的版本Branch是 夾在某頁的書籤Worktree則是 讓你攤開書本的工作桌
傳統做法中,我們只有一張工作桌。每當要切換書籤時,就必須把桌面上正在修改的紙張全部收起來或藏進抽屜(也就是 git stash)。
而 Git Worktree 則允許你同時擁有好幾張 獨立的工作桌。
| 比較項目 | Git Branch | Git Worktree |
|---|---|---|
| 工作區概念 | 共用單一實體工作目錄 | 擁有多個獨立的實體工作目錄 |
| 切換分支代價 | 需提交、Stash 或暫存變更 | 無須 Stash,直接切換目錄即可 |
| 隔離安全性 | 未提交檔案可能產生衝突或殘留 | 目錄完全隔離,變更互不干擾 |
| 歷史紀錄 | 共用 Git Commit 歷史與分支 | 共用 Git Commit 歷史與分支 |
不同 Worktree 的目前分支、暫存區與未提交修改完全獨立,但它們彼此會 共用所有的 Commit 歷史與分支紀錄。
Branch 是版本書籤,Worktree 是實體工作桌
這樣一來,你需要切換任務時,只要開啟另一個資料夾目錄即可,完全不需要變動當前的開發狀態。
如何開始使用 Git Worktree?
在實際專案中導入 Git Worktree 時,良好的目錄規劃能讓開發更順暢。
建議把原本 git clone 下來的專案目錄當作乾淨的 main 總部,並將新建的 Worktree 目錄放在專案外層(例如 ../my-app-worktrees),避免開發工具遞迴掃描資料夾時出錯。
常用的指令流程如下:
| 流程 | 指令 |
|---|---|
| 1. 建立新 Worktree 並同時建立新分支 | git worktree add ../my-app-worktrees/feature-login -b feature-login |
| 2. 查看目前所有的 Worktree 清單 | git worktree list |
Git Worktree 特別適合用來管理 AI Agent 的開發任務。
你可以給 AI Agent 一個獨立的 Worktree 目錄讓它盡情修改與測試,而人類開發者可以在另一個 Worktree 進行程式碼審查(Review)與測試。
給 AI Agent 獨立的 Worktree,讓 AI 開發與人類審查可以平行處理
兩者在各自的實體目錄中運作,既安全又清晰。
開發完成後如何合併與安全清理?
當你在獨立的 Worktree 完成開發後,接下來該如何將成果合併並進行清理?
請記住一個重要觀念:Worktree 目錄本身不需要合併,真正要合併的是 Branch 分支。
你只需要回到 main 的工作桌目錄,直接執行 git merge 對應的功能分支即可完成整合。
清理時請依照標準的二步驟流程:
| 步驟 | 指令 |
|---|---|
| 1. 移除 Worktree 實體目錄 | git worktree remove ../my-app-worktrees/feature-login |
| 2. 刪除已完成的功能分支 | git branch -d feature-login |
先移除 Worktree 目錄,再刪除 Branch 分支
請務必使用 git worktree remove 指令來清理,而不是直接在檔案總管中手動刪除資料夾。
使用 Git Worktree 有哪些常見陷阱?
雖然 Git Worktree 非常方便,但在使用時有幾個地雷需要特別注意。
陷阱 1: 未提交的修改會遺失
雖然刪除 Worktree 不會刪除 Branch 分支,但如果你在該目錄還有沒 commit 的變更,強制刪除 Worktree 目錄就會導致那些未提交的修改付之一炬。
陷阱 2: 分支佔用衝突
Git 的保護機制 不允許同一個 Branch 分支同時在兩個不同的 Worktree 中 Checkout。如果你試圖在第二個 Worktree 切換到已經被佔用的分支,Git 會直接阻擋並拋出錯誤訊息。
強制刪除 Worktree 會失去尚未 Commit 的變更
只要掌握好這些特性與原則,就能避免踩坑。
結論
透過 Git Worktree,我們可以徹底告別混亂的分支切換與 git stash 流程,實現真正的多線程開發。
下次不管是遇到緊急 Bug 需要修復、同時推進多個功能,還是指派任務給 AI Agent 協助寫程式,不妨試著開一張新的工作桌吧!