在日常開發中,你是不是也曾遇過這種窘境:
git stash
、切分支、修 bug、再回來 stash pop
… 一整個心累 😩其實 Git 早就幫你想好解方了,那就是 —— git worktree
:在同一個 repo 中,開出多個「工作目錄」平行開發!
git worktree
是什麼?Worktree(工作樹)讓你在同一個 Git 倉庫中建立多個獨立的工作目錄。
每個目錄都可以:
.git
版本資料可以想成是 Git 的「分身術」 —— 讓你同時存在於多個平行世界,開不同分支卻互不干擾。
最基本用法:
git worktree add <路徑> <分支名稱>
git worktree add ../feature-login feature/login
說明:
../feature-login
:新建工作目錄的路徑feature/login
:要 checkout 的分支(不存在會自動建立)建立後你會得到這樣的結構:
/project ← main 分支
/feature-login ← feature/login 分支
此時可以同時在兩個目錄開發,不會互相干擾
如果你想把 已有分支 檢出到另一個目錄:
git worktree add ../hotfix hotfix/typo
這樣你就能在 ../hotfix
下開發 hotfix,而不必動 main!
git worktree list
範例輸出:
/home/user/project 123abc [main]
/home/user/feature-login 456def [feature/login]
/home/user/hotfix 789ghi [hotfix/typo]
每個工作目錄都會顯示:
一目了然 👍
使用完可以安全移除:
git worktree remove ../feature-login
不會影響原始 repo,但請確保該目錄乾淨(沒有未提交變更)
若出現「dead worktree」殘留,可以清理:
git worktree prune
假設你在 main 分支開發,突然發現 typo 需要立刻修正:
# 建立一個 hotfix 分支的 worktree
git worktree add ../hotfix hotfix/typo
# 進入 hotfix 工作樹
cd ../hotfix
# 修正 bug 並提交
git add typo.js
git commit -m "修正拼字錯誤"
git push origin hotfix/typo
這樣就能:
指令 | 意思 | 用途說明 |
---|---|---|
git worktree add <path> <branch> |
建立新 worktree | 同時開多分支、避免切換衝突 |
git worktree list |
列出所有 worktree | 查看目前有哪些工作目錄 |
git worktree remove <path> |
移除 worktree | 清理不再使用的目錄 |
git worktree prune |
清理 dead worktree | 移除已不存在的工作樹紀錄 |
如果你想「只看舊版本、不綁分支」——可以用 --detach
:
git worktree add --detach ../temp
這會建立一個 detached HEAD 的目錄(不屬於任何分支)。
功能比較 | git worktree add ../feature feature |
git worktree add --detach ../temp |
---|---|---|
HEAD 狀態 | Attached(綁在分支上) | Detached(不屬於任何分支) |
是否建立分支 | 是 | 否 |
是否追蹤遠端 | 會 | 不會 |
適合用途 | 正式開發 | 臨時測試、查看舊版本 |
可隨時刪除 | 建議保留 | 可直接刪除 |
💡 一句話記住:
-detach
= 純測試、不綁分支、安全實驗用。
多分支同時存在
每個 worktree 各自 checkout 不同分支,彼此獨立。
共用 .git,節省空間
不用多 clone,磁碟負擔更小。
自動管理引用
新增或移除 worktree 會同步更新 .git/worktrees/
。
安全限制
同一分支不能被多個 worktree 同時 checkout,避免衝突。
試著在同一個 repo 中:
feature/login
、hotfix/typo
成功完成,就代表你掌握了 Worktree 的真功夫!
它的優點:
git stash
有了 git worktree
,你再也不用為「切分支忘 stash」的夢魘驚醒啦 😎