你正在 main 分支改着一半代码,突然要切到 hotfix 上紧急修一个 bug。常规操作是 git stash 再切换,来回折腾。有没有更直接的方式?git worktree 就是为这种场景准备的。
简单说,它让你在同一个 Git 仓库下同时 checkout 出多个分支,每个分支有自己独立的工作目录,但底层 .git 数据是共享的。不用再 clone 一整份新仓库,也不用 stash 来 stash 去。
官方文档:git-worktree
像多开副本一样工作
正常 clone 下来的那个目录叫主工作树(main worktree)。通过 git worktree add 创建出来的目录叫链接工作树(linked worktree),它们全都指向同一个仓库,只是当前分支不同。
最常用的几个命令:
git worktree add <path> <branch>:在<path>创建一个新工作树,并检出<branch>git worktree list:列出当前仓库所有工作树及状态git worktree remove <path>:删除指定路径的工作树(目录必须是 clean 的)git worktree prune:清理那些已经被手动删除掉的工作树记录
拿个实际例子看。假设当前目录是 myproject/,正处在 main 分支。现在要在 feature/login 分支上继续开发,执行:
git worktree add ../myproject-login feature/login
隔壁会多出一个 myproject-login/ 目录,里面已经是完整的 feature/login 分支文件。两个目录互不干扰,你可以:
- 在
myproject/里接着修 main 上的问题 - 在
myproject-login/里写登录功能
共享同一个对象库的好处是,新建分支、切换、推送这些操作都很快,也不用再折腾 stash 或临时 commit。
查看所有工作树:
git worktree list
输出类似:
/path/to/myproject abcd123 [main]
/path/to/myproject-login ef45678 [feature/login]
不需要某个工作树时,先确保目标目录没有未提交改动,然后执行:
git worktree remove ../myproject-login
如果目录已经被手动删除,可以运行 git worktree prune 清理掉残留的元数据。
几个容易踩的坑
- 同一个分支不能建多个 worktree,Git 会直接拒绝。
- 不能删除当前正在使用的工作树,这很合理。

