git worktree add 更可靠,因其直接创建独立目录检出分支,原工作区零改动、无恢复风险;而 git stash 依赖 reflog,易因冲突、pop 失败或 gc 清理导致改动丢失,且不保存未跟踪文件。

git worktree add 为什么比 git stash + checkout 更可靠
因为 git stash 本质是把未提交改动打包进 reflog,一旦冲突、pop 失败或忘记应用,改动就“悬空”了;而 git worktree add 是直接创建新目录并检出分支,原工作区文件完全不动,不存在恢复失败的风险。
常见错误现象:在复杂修改(如重命名+内容变更混合)后执行 git stash,再 git stash pop 时出现 merge conflict,甚至部分文件没被还原;而 git worktree 完全绕过这个路径。
- stash 依赖暂存区状态是否干净,worktree 不依赖
- stash 会丢弃未跟踪文件(除非加
-u),worktree 默认保留所有文件位置独立 - stash 记录在
refs/stash,容易被git gc清理;worktree 的目录和链接文件物理存在,一目了然
如何为多个 Bug 创建隔离的排查环境
你收到三条告警:登录页白屏、支付回调超时、用户头像不显示。它们分别对应 hotfix/login-blank、hotfix/payment-timeout、hotfix/avatar-missing 分支。不需要反复切换,直接为每个开一个 worktree:
git worktree add ../bug-login hotfix/login-blank git worktree add ../bug-payment hotfix/payment-timeout git worktree add ../bug-avatar hotfix/avatar-missing
每个目录都是干净、独立的,可同时开三个终端或 IDE 窗口调试。注意:
- 路径必须是**绝对路径或相对于当前仓库根目录的相对路径**,不能是已有文件或目录名
- 如果目标分支不存在,
git worktree add会失败,需先git fetch origin或手动创建分支 - 不要手动删除
.git文件——每个 worktree 目录下的.git是指向主仓库.git/worktrees/xxx的软链接,删错会导致 Git 无法识别该 worktree
排查完 Bug 后怎么安全清理 worktree
修完一个 Bug 并 push 后,别直接 rm -rf ../bug-login。Git 不知道你删了它,下次 git worktree list 还会显示该条目,且可能报错 “working tree is missing”。正确做法是:
git worktree remove ../bug-login
这个命令会:
- 自动清理
.git/worktrees/xxx下的元数据 - 检查该 worktree 是否有未推送的 commit,有则拒绝删除(防止误删)
- 然后才允许你手动删目录
如果已误删目录,用 git worktree prune 手动清理残留记录。
遇到“fatal: invalid reference”错误怎么办
执行 git worktree add 时报这个错,通常不是权限问题,而是:git worktree 要求目标分支必须能解析为一个有效 commit,不能是空分支或刚新建但还没任何 commit 的分支。
典型场景:
- 你
git checkout -b hotfix/new-bug新建分支,但还没做任何修改、也没git add,此时分支指针指向空(no commit yet) - 远程分支存在但本地没 fetch,
git worktree add ../xxx origin/bug-123会失败,必须先git fetch origin
验证方式:运行 git show-ref hotfix/new-bug,如果无输出,说明该分支尚无 commit,需至少一次 git commit --allow-empty -m "init" 后再试。
../bug-login 里修完 bug 并 push,其他 worktree(包括主目录)仍停留在旧的 hotfix/login-blank commit 上。需要手动 git pull 或 git reset --hard origin/hotfix/login-blank 才能拿到最新修复——这点和单目录 checkout 行为一致,但因并行操作多,更容易忘记。


















