Git Worktree:一个仓库多个工作目录
需求写一半要紧急修 bug,传统做法是 stash → 切分支 → 修完 → 切回来 → pop。来回几趟,IDE 索引全部重来。
git worktree 换个思路:同一个 .git,挂多个工作目录,每个目录待在不同分支上。开两个编辑器窗口就行。
一、基本命令
git worktree add ../hotfix main # 新目录,检出 main
git worktree add ../feature-x feature/x # 检出已有分支
git worktree add -b feature/y ../feature-y # 新建分支并检出
git worktree list # 看所有工作目录
git worktree remove ../hotfix # 删掉
目录建在仓库外面比较好,避免 git status 互相干扰。
二、为什么比 stash 好用
- 不需要来回切:两个分支的代码同时在场,两个编辑器同时开
- 编译互不影响:旧分支的构建产物和新分支的互不覆盖(配合各自独立的
node_modules/target) - 对比方便:直接
diff -r两个目录,或把新版文件拷过去 - 长时间并行:stash 放一个月早晚被误清,worktree 不会
三、典型场景
紧急热修:
git worktree add ../hotfix main
cd ../hotfix
# 修完提交、推送、提 PR
cd -
git worktree remove ../hotfix
同时跑测试:一个目录改代码,另一个目录跑耗时集成测试,互不打断。
验证老版本行为:git worktree add ../v1.2 v1.2.0,切过去复现 bug,不动当前工作区。
四、规则与限制
- 同一个分支在多个 worktree 里不能同时检出(除非
--force,容易出乱子) - 主工作目录不能
remove,只能删附加的 - worktree 目录不能是别处目录的父目录,也不能在另一个 worktree 内部
- 删目录前用
git worktree remove,直接rm -rf会留下.git/worktrees里的脏记录
五、清理残留
git worktree prune # 清理指向已不存在目录的记录
git worktree list # 确认
六、小结
如果一天里会切分支超过三次,worktree 就值得用。它不是银弹——目录多了占磁盘、依赖要各装一份——但对"并行两个分支"这件事,它比 stash 和 clone 都干净。