应用场景
在实际的日常开发中,我们总是会有很多场景,需要来回切换分支,暂存代码,例如:
- 场景 1:修复紧急问题(正在开发,临时插播) :正在
feature分支开发新功能,写了一半,这个时候有紧急的生产问题要修复,需要切换到release分支做修复工作。 - 场景 2:大型重构工作(回看对比) :做一个大型重构工作,改了大量代码,改出问题,想回来看看原来没修改前的代码是什么样的。
- 场景 3:并行开发(同步公共修改): 同时开发两个迭代,开了不同的
feature分支,其中一个feature1分支做了一些公共修复或其基类、工具类代码的修改,想同步到另一个feature2分支。
传统解决方式
- 场景 1:
git stash(暂存) ->git checkout release-> 修复 ->git checkout feature->git stash pop。 - 场景 2: 在同一个 IDE 里来回切换分支,或者在 Git 历史里翻找。
- 场景 3: 在
feature1提交 -> 切到feature2->cherry-pick。
git worktree
git worktree 就是在同一个 Git 仓库中,通过共用同一套历史记录,让你能同时在多个不同的工作目录下并行开发、测试或修复多个分支,而无需来回切换或重新克隆。
git worktree有点像 git clone,在物理磁盘上存多一份代码,但是是用同一个 .git 目录管理。

实践

假设现在有一个 main 分支,然后要切换到 hotfix 改 bug。

文件目录内容:

1. 创建新 worktree 目录
csharp
// git worktree add [worktree 目录地址] [分支名称]
git worktree add ./worktree-hotfix hotfix
如果没有 hotfix 分支,想在当前分支拉出一条新分支就加上 -b参数,即:git worktree add ./worktree-hotfix -b hotfix

成功之后会发现多了一个文件夹,里面的代码和 hotfix 分支的一样:

一般来讲,目录会设置为../worktree 目录名,和当前项目地址同级,比较好管理依赖,这里为了方便演示,就放在了项目内容。
2. 在 worktree-hotfix 中修改bug,并提交代码
bash
cd worktree-hotfix
修改代码。

提交代码:git add . -> git commit -m "fix: 修复了一个 bug"-> git push。
然后代码就会推送到 hotfix 的远程分支上。
重点:
- 分支和 worktree 是一一对应的,你在不同的 worktree 对应的是不同的分支。
- 上述例子中:根目录代表的是
main分支,而./worktree-hotfix代表的是hotfix分支。 - 简单理解:切目录就等于切分支。

3. 移除 worktree
这里有两种移除 worktree 分支的方式:
- 方式 1:直接删除,然后清理记录
-
- 删除整个
worktree-hotfix目录 - 运行
git worktree prune移除失效的记录
- 删除整个
- 方式 2(推荐):直接使用
remove命令删除
-
- 运行
git worktree remove [目录名称]
- 运行

我这里本来就在 worktree-hotfix 目录,所以目录是./,如果你在根目录,目录名称是./worktree-hotfix。当然,也可以使用绝对路径
4. 合并代码
最后将 hotfix 分支合并到 release 或其他分支即可。
至此,就是通过 git worktree 完成一个紧急 bug 的修复的全过程。其他常见场景的 worktree 操作也是类似的。过程中可以通过 cd 命令在不同的分支上来回切换而不需要暂存文件。
其他命令
查询
查看当前有哪些 worktree,目录地址是什么,对应的分支是哪条:
git worktree list

移动
将一个 worktree 目录移动到别的地方:
arduino
git worktree move ./worktree-hotfix ../

锁定
防止 worktree 被移动或被删除:
bash
git worktree lock /Users/ut/Documents/learn/worktree-hotfix

解锁
bash
git worktree unlock /Users/ut/Documents/learn/worktree-hotfix
和 Agent 的结合
- 你可以通过
git worktree利用不同的 Agent 开发不同的功能,如 Agent1 在 worktree1 上工作,让 Agent2 在 worktree2 上工作,互相独立,互不影响。 - 也可以将修复临时 bug 的 worktree 管理流程写成一个 skills,例如:每次让 Agent 改 bug,先新建一个 worktree,在里面改完 bug,验证完没有问题,再自动删除 worktree,将代码合并到指定分支。
- 目前部分 AI IDE 已经能自动利用 worktree 并行开发,只要通过一些配置即可做到。如:常见工作流程 - Claude Code Docs