Git Worktree 实战:大型 Rails 项目多分支并行开发指南

改 feature 改到一半,突然要 hotfix。git stash 存了一堆不敢 pop,git clone 又要等半天装依赖——你一定经历过这种痛苦。

AI 时代,为什么 Worktree 变得更重要了?

以前 worktree 的价值是"人在写 feature A 的时候,能随时切去 hotfix B"。但到了 AI 时代,这件事变得更有意思了——

你可以让多个 Code Agent 同时在不同的 worktree 里开发不同的功能。

1
2
3
4
~/projects/myapp-worktree/
    OA-001/   ← Agent 1 在写用户权限模块
    OA-002/   ← Agent 2 在写报表导出功能
    OA-003/   ← Agent 3 在修一个线上 bug

每个 worktree 是独立的工作区,Agent 之间互不干扰。你只需要开几个终端窗口,每个窗口里让一个 Agent 对着各自的 worktree 干活,最后分别提 PR、review、merge。

以前一个人串行做三件事,现在三个 Agent 并行,你只负责 review。 Worktree 从"方便切分支"变成了 AI 并行开发的基础设施。

但前提是——你得先搞定 worktree 本身。大型 monorepo 里切分支的真实代价:

  • node_modules + vendor/bundle 动辄几个 GB,重装一次几分钟起步
  • config/database.ymlmaster.key.env 不在版本控制里,切完分支全没了
  • 不同分支 migration 状态不同,切一次可能要 db:migrate + db:rollback
  • git stash 堆了十几条,哪个是哪个?不敢碰

你真正想要的是:多个分支同时打开,各干各的。

Git Worktree 就干这件事——一个 .git,多个工作目录,每个目录锁定一个分支。不用多次 clone,不用 stash,真正的并行开发。

1
2
3
4
5
6
~/projects/myapp/                    ← 主 worktree (develop)
    .git/                            ← 唯一的 git 数据库

~/projects/myapp-worktree/
    OA-12345-new-feature/            ← feature 分支
    OA-67890-hotfix/                 ← hotfix 分支

所有 worktree 共享同一份 git 历史,fetchpush 在任何一个目录里做都行。但每个目录有独立的工作区,互不干扰。

30 秒上手

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 创建 worktree
git worktree add ../myapp-worktree/OA-12345 feature/OA-12345

# 查看所有 worktree
git worktree list

# 删除
git worktree remove ../myapp-worktree/OA-12345

# 清理失效记录
git worktree prune

但是,大项目的 worktree 不是 checkout 完就能用

这是教程不会告诉你的。裸创建的 worktree 缺了一大堆 gitignored 的东西database.ymlmaster.key.envvendor/bundlenode_modules……

你不会想在每个 worktree 里重新 bundle install + npm install 吧?

解法:用 symlink 把主 repo 的配置和依赖链接过去。 但手写脚本要硬编码路径、不好维护、换项目要重写。

所以我做了 gw —— 一个轻量的 Git Worktree 管理工具,解决这个问题。

gw:一步到位的 Worktree 管理

安装

1
curl -fsSL https://raw.githubusercontent.com/graysonchen/gw/main/install.sh | bash

初始化项目

1
2
3
cd ~/projects/myapp
gw init                    # 创建 .gw/config 和 .gw/links
gw config edit-links       # 编辑要 symlink 的文件列表

.gw/links 是纯文本,一行一个路径:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 配置文件
.bundle/config
config/database.yml
config/master.key
.env

# 依赖(共享省磁盘)
vendor/bundle
node_modules

# 缓存
tmp/cache

日常使用

1
2
3
4
5
gw add feature/OA-12345   # 创建 worktree + 自动 symlink,一步到位
gw cd OA-12345             # 跳转(支持 fzf 模糊搜索)
gw list                    # 列出所有 worktree
gw link OA-12345           # 改了 links 后重新链接
gw rm OA-12345             # 清理

gw add 一条命令搞定创建 + 链接,进去就能 rails server

数据库怎么办?

代码可以并行,但数据库只有一个。三种策略:

  1. DB Dump / Load(推荐):主 repo make dbdump,worktree 里 make dbload + db:migrate
  2. 独立数据库:worktree 里用不同的 database.yml,指向 myapp_dev_OA_12345
  3. 只看代码:不启动服务器,只做 review / cherry-pick,不用管数据库

什么时候该用?

场景方案
紧急 hotfix,手上有未完成的工作✅ worktree
长期同时开发两个 feature✅ worktree
Code review 想在本地跑起来✅ worktree
临时看另一个分支的代码git stash + checkout
只是对比文件差异git diff

工具链接:gw — Git Worktree Manager

使用 Hugo 构建
主题 StackJimmy 设计