手头分支有未提交改动时,如果突然需要基于主分支处理一个独立修复,git worktree 可以新增工作目录,共用同一仓库对象库,又不必暂存当前现场或重新克隆。
环境:Git 2.39+;Bash 或 zsh;仓库远端名为 origin,主分支为 main。
先更新远端引用,再从 origin/main 创建新分支和工作目录:
git fetch origin
git worktree add -b fix/login-timeout ../myapp-login-fix origin/main
git worktree list
原目录仍停留在当前分支;新目录已经检出 fix/login-timeout。可以直接在新目录执行命令,而不必来回 cd:
git -C ../myapp-login-fix status
git -C ../myapp-login-fix log -1 --oneline
完成修改、提交并合并后,回到原仓库移除工作目录:
git worktree remove ../myapp-login-fix
git worktree prune
有三个细节值得注意:
- 同一个本地分支不能同时检出到两个 worktree;新增目录时使用独立分支名。
- 每个 worktree 的工作区和暂存区彼此独立,但提交与引用属于同一仓库,因此一边创建的提交会立即被另一边看到。
git worktree remove默认会拒绝移除含未提交改动的目录。先确认状态,不要把--force当作常规清理方式。
这套流程尤其适合临时修复、代码审查和多版本验证:保留原任务上下文,同时让每个工作目录维持清晰的分支边界。