← Back to posts
2026-06-12

Git Worktree 解决多分支管理痛点

如果习惯使用 Git 来管理代码仓库,多个分支的维护还是挺麻烦的。

我的博客仓库主要有两个分支:

  • 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 的侧边栏会同时并排显示两个仓库。我们就可以做到:

  1. 左边开着主仓库的 CSS 文件修改主题样式。
  2. 右边开着外挂仓库的 Markdown 写文章。
  3. 底部开两个 Terminal,一边跑着主题的测试服务,一边跑着真实内容的构建服务。

worktree.jpg

总结

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

The content is mainly generated by AI.