Cursor 推出的「并行代理」可以让我们同时执行多个 AI 任务。想象一下,我们手下有一个开发小组,每个 Agent 就是一个组员,他们共同推进一个项目的多个功能实现,以及 Bug 修复。

那么,他们是如何像专业的软件工程师一样,通过熟练的操作 Git 的 check out,merge,commit,并且能够尽量避免代码合并时的冲突的呢?

今天就来介绍一下驱动 AI 「并行代理」背后的基础技术:Git worktree。

Git worktree 是什么

Git worktree 是 Git 提供的一种机制,允许你在同一个仓库历史(同一个 .git)下,同时拥有多个独立的工作目录,每个目录可以检出不同的分支或提交

用简单的一句话定义:

不用切分支、不用 stash,就能在不同文件夹里同时干不同分支的活。

Git worktree 的意义

想象一下传统的工作流程,当我们开发某个功能到一半的时候,需要去修复一个突发的高危 Bug,我们需要先将当前编辑完没提交的文件先暂存,然后新建和检出到 Bug 修复的分支;当 Bug 完成修复之后,我们又需要回到之前的功能分支,然后取出暂存的文件,继续功能开发。

整个流程非常的繁琐,需要 8 - 10 条命令才能完成,对于开发者也是一笔不小的心智负担,切换任务上下文会消耗掉很多宝贵的专注力。

在这种情况下,Git worktree 就非常的有意义了,它可以:

直接通过git worktree add <path> <branch>创建并检出指定分支到新的文件夹,无需处理当前还没提交的文件,就像开辟了一个平行宇宙一样,直接开始做其他的功能或者修复。更妙的是,我们可以同时创建多个 worktree,如同漫威的多重宇宙一样,并行的推进多个项目分支。

Git worktree 为什么突然变得重要了

作为一个熟练使用 Git 的老程序员,老实说前些年其实很少用到 Git worktree,更多的还是使用传统的 stash / unstash 那一套,那么,为什么 Git worktree 突然变得重要起来了呢?

答案就是 AI Coding 及其带来的生产关系变革。

在「以人为本」的传统软件开发领域,我们通常只能代表我自己一个人,受限于人类的能力界限,人类工程师并不擅长同时并行的推进多个功能分支的开发,人类的专注力和多任务处理能力相比 AI 来说还是太弱了。

所以在工作中,我们更多的还是「单线」处理任务,只需要不停的在各个分支上进行切换就可以了。

然后,AI Coding 就来了。

Git worktree 对 AI 编程的加成

大家似乎都很乐于「压榨」AI 这个不眠不休的员工:从早期的「让 Codex 通宵跑任务」,到如今几乎成为标配的「并行代理(Parallel Agents)」,我们一直在做的,其实只有一件事——不断逼近 AI 编程效率的上限。

而 Git worktree,正好在这里派上了用场。

人类很难同时推进多个分支,但 AI 可以,而且非常擅长。我们只需要为它搭建好足够清晰、互不干扰的工作空间,它就能并行完成多个功能开发和 bug 修复,同时把冲突和相互影响降到最低。

Git worktree 就是用来做这件事的,它允许你在同一个仓库中,同时检出多个分支,并把它们放在彼此完全隔离的工作目录里。

每一个 worktree,都是一块独立的「施工现场」:有自己的代码状态、自己的修改记录,不会互相覆盖,也不需要频繁 stash、切分支、再切回来。

当你把不同的任务明确分配到不同的 worktree——比如一个负责重构、一个修 bug、一个加新功能——AI 就可以在多个分支上同时推进,而不必担心上下文混乱或代码相互污染。你要做的,只是定义好边界和目标,其余的交给它持续产出即可。

在这个层面上,Git worktree 不再只是一个「高级 Git 技巧」,而是让 AI 编程真正进入并行时代的关键基础设施。

如何学习 Git worktree

我无意将本文变成一个 git 命令教程,所以大家可以查看这个很棒的教程,来具体学习 Git worktree 的命令使用方式。

或者,当我们在使用 Cursor 等编程工具的「并行代理」功能,同时开发多个功能的时候,我们就已经在使用 git worktree 了,因为它们的背后就是 AI 代理自己创建和管理 worktree。

其他注意事项

需要注意的是,worktree 创建出的「平行宇宙」是缺少一些初始化信息的。因为 worktree 实质是创建了一个新的文件夹路径,因此类似 .env环境配置文件,以及包管理工具下载的大量文件都是不会被带到「新宇宙」里的。我们在创建完 worktree 之后还需要手动复制 .env和执行 npm install等包安装操作。

对于 Cursor 等编程工具,我们可以通过配置 .cursor/worktrees.json文件,来告诉 Cursor 在每次创建 worktree 的时候做一些准备工作,从而避免手动的去复制 .env和执行包安装命令:

{
  "setup-worktree": [
    "pod install", // 执行 Cocoapods 安装
    "cp $root/.env" // 复制 .env 文件, $root 是你的项目根目录
  ]
}


 

2
0