Git Worktree 解决多分支管理痛点
我的博客仓库主要有两个分支:
master分支:用于维护博客框架。为了方便测试,我经常会在这里随便生成一些测试用的content/和public/目录,并在.gitignore中将它们忽略。forimagine分支(个人分支):用于存放真正发布的博文内容。
灾难发生在切换分支时:
当我在 master 分支做完功能测试,满地都是乱七八糟的测试产物,此时执行 git switch forimagine 准备写几篇真正的博客时,Git 会将 master 分支下那些被忽略或未跟踪的 content/ 和 public/ 目录留在原地。它们要么会导致文件冲突报错,要么直接污染了我 forimagine 的分支。
为了解决这个问题,之前我只能选择来回 git stash,甚至重新 git clone 一个仓库。
但其实,Git 早在 2.5 版本就引入了一个适合这一需求的功能——git worktree。
什么是 Git Worktree?
在传统的认知中,一个本地文件夹只能对应一个 Git 分支状态。想看另一个分支的代码,就必须在同一个文件夹里切来切去。
而 git worktree 的核心理念是:“多个物理文件夹,共享同一个底层的 Git 数据库”。
通过它,可以把仓库的另外一个分支“外包”到一个完全独立的物理文件夹中去。这两个文件夹在电脑硬盘上是物理隔离的,各自拥有独立的工作区;但在底层,它们共享着同一个 .git 历史记录。在 A 文件夹提交了代码,B 文件夹立刻就能感知到。
实战演练:搭建“双开”工作流
下面以我的 r-blog 博客项目为例,一步步搭建双目录工作流。
1. 整理目录结构
为了方便管理,我先在电脑里建一个统一的父级文件夹,比如叫 MyBlogSpace。然后将主仓库放在里面:
MyBlogSpace/
└── r-blog/ <-- 主仓库(当前在 master 分支)
2. 创建 Worktree 外挂目录
打开终端,进入 r-blog 主仓库,执行以下命令,将用于写文章的 forimagine 分支挂载到旁边的一个新文件夹中:
cd MyBlogSpace/r-blog
# 语法:git worktree add <新文件夹路径> <分支名>
git worktree add ../forimagine-r-blog forimagine
3. 新的代码目录结构
现在,打开 MyBlogSpace 文件夹,会发现多了一个 r-blog-personal 目录,其内部结构:
MyBlogSpace/
├── r-blog/ <-- 【主仓库】永远固定在 master 分支
│ ├── .git/ <-- 真正的 Git 数据库(超大文件夹)
│ ├── content/ <-- master专用的测试内容(随便造,不怕混乱)
│ └── public/ <-- master专用的测试产物
│
└── r-blog-personal/ <-- 【Worktree 仓库】永远固定在 forimagine 分支
├── .git <-- 注意!它只是个文本文件,指向主仓库的 .git
├── content/ <-- 我真实的博文内容(安全纯净)
└── public/ <-- 我真实的线上构建产物
- 想改博客主题或者实现新功能?打开
r-blog文件夹随便折腾。 - 想写新文章?打开
r-blog-personal文件夹安心码字。 两边的构建产物互不干扰,世界彻底清静了。
Worktree 的日常管理
1. 查看当前的 Worktree 列表
在任意一个关联目录中,运行以下命令可以查看当前仓库挂载了哪些目录:
git worktree list
输出示例:
/path/to/MyBlogSpace/r-blog 1a2b3c4 [master]
/path/to/MyBlogSpace/forimagine-r-blog 5d6e7f8 [forimagine]
2. 重命名或移动目录
⚠️ 警告:不要直接在操作系统的文件管理器里去改 Worktree 文件夹的名字或移动它们! 因为它们底层是通过绝对路径绑定的,直接改名会导致 Git 找不到路径。
如果需要重命名,请使用 Git 原生命令(需 Git 2.17+):
# 语法:git worktree move <旧路径> <新路径>
git worktree move ../forimagine-r-blog ../new-name-r-blog
如果已经用系统把文件夹移走了怎么办? Git 提供了修复命令,只需在终端进入主仓库的目录,告诉主仓库小弟去哪了:
# 语法:git worktree repair <外挂仓库移动后的新路径>
git worktree repair ../new-name-r-blog
Git 会自动顺藤摸瓜,把两边断掉的链接全部重新接上。
3. 不想用了如何删除?
如果某个分支的开发任务结束了,想删掉外挂的文件夹,同样不建议直接暴力 rm -rf。正确的卸载方式是:
# 在主仓库下执行
git worktree remove ../forimagine-r-blog
放心,这仅仅会删掉那个外挂文件夹,代码和分支依然完好无损地保存在主仓库的 Git 数据库里。
💡 终极体验:搭配 VS Code 工作区
既然我们已经把主仓库和 Worktree 仓库都放在了 MyBlogSpace 目录下,那么最爽的开发姿势是什么呢?
直接用 VS Code 打开 MyBlogSpace 父级目录!
这样,VS Code 的侧边栏会同时并排显示两个仓库。我们就可以做到:
- 左边开着主仓库的 CSS 文件修改主题样式。
- 右边开着外挂仓库的 Markdown 写文章。
- 底部开两个 Terminal,一边跑着主题的测试服务,一边跑着真实内容的构建服务。

总结
git worktree 完美解决了同一仓库下多分支状态差异巨大的痛点。它极其适合 “正在开发新需求,突然要切回老版本修复紧急 Bug” 的传统开发场景。
The content is mainly generated by AI.