跳到主要内容

Git Worktree 多分支并行开发

git worktree 让你在同一仓库中同时 checkout 多个分支到不同目录,无需 clone 多份代码。

为什么需要 Worktree

传统方式下切换分支会强制你暂存或提交当前改动,打断工作流。Worktree 让每个分支独立占用一个工作目录,互不干扰。

典型场景:

  • 正在 feature-a 分支开发,突然需要修 main 分支的紧急 bug
  • 同时维护多个版本(如 v1.x 和 v2.x)
  • 对比两个分支的文件差异
  • CI/CD 中并行构建不同分支

基本用法

添加 Worktree

# 从当前分支创建一个新的 worktree
git worktree add ../my-feature feature-branch

# 创建新分支并同时建立 worktree
git worktree add -b hotfix-urgent ../hotfix main

查看 Worktree 列表

git worktree list

输出示例:

/home/user/project abc1234 [main]
/home/user/my-feature def5678 [feature-branch]
/home/user/hotfix ghi9012 [hotfix-urgent]

删除 Worktree

# 先删除目录,再清理引用
rm -rf ../my-feature
git worktree prune

或一步到位:

git worktree remove ../my-feature

高级技巧

锁定 Worktree

防止被意外清理(如正在 CI 构建中):

git worktree lock ../my-feature --reason "CI build in progress"
git worktree unlock ../my-feature

在 Worktree 间共享未提交改动

Worktree 各自独立,但可以通过 git stash + 手动 apply,或用 git diff > patch 传递。

稀疏检出

只检出部分文件以节省空间:

git worktree add --no-checkout ../sparse main
cd ../sparse
git sparse-checkout init --cone
git sparse-checkout set path/to/subdir
git checkout

注意事项

限制说明
同一分支同一个分支不能被两个 worktree 同时 checkout
子模块每个 worktree 的子模块独立,需单独初始化
磁盘空间每个 worktree 共享 .git 对象库,但工作文件独立占用空间
裸仓库worktree 必须在非裸仓库中创建

对比 git clone

git worktreegit clone
磁盘占用共享对象库,更省空间完全独立,占用翻倍
分支同步自动感知所有分支需要 fetch/pull
配置共享共享 .git/config各自独立配置
适用场景同仓库多分支并行完全独立的工作副本

常见问题

Q: 删除 worktree 后 git branch 还能看到分支? A: worktree 删除不等于分支删除。用 git branch -d branch-name 删除分支。

Q: 可以在 worktree 里 rebase 吗? A: 可以,但不建议在主 worktree 和子 worktree 同时操作同一个分支历史,容易产生冲突。