AI 改代码后如何用 Git Worktree 做隔离和 Diff

编程

让 AI 直接在主工作区改代码,改坏了很难分清哪些是它干的。Git Worktree 给每个 AI 任务一个独立工作目录、共享同一个仓库,改动天然隔离、Diff 一目了然、还能并行跑多个任务。本文给出完整工作流和脚本。

用 Claude Code、Cursor、Codex 这类工具让 AI 改代码,很快会撞上一个尴尬:AI 在你当前的工作目录里一顿改,改完你想 review,却发现它的改动和你自己没提交的改动混在一起,分不清哪行是谁写的;想同时让 AI 跑两个不相关的任务,它们又在同一个目录里互相踩脚。回滚更麻烦——不确定哪些文件被动过。

Git Worktree 是这个问题的干净解法:同一个仓库,多个独立工作目录。给每个 AI 任务分配一个 worktree,改动天然隔离、Diff 清清楚楚、随时能整个丢弃,还能并行跑多个任务互不干扰。这篇文章把这套工作流讲透。

版本控制的分支与并行开发
版本控制的分支与并行开发

Worktree 的核心:一个 .git 仓库,挂出多个独立的工作目录,每个目录一个分支。

Git Worktree 是什么

平时用 Git,一个仓库对应一个工作目录,切分支就是在这个目录里换内容——所以有未提交改动时切分支会被拦住。git worktree 打破了这个限制:它让同一个仓库同时检出到多个目录,每个目录停在不同分支上,共享底层的 .git 对象库(所以不占多份磁盘,也不用重新 clone)。

# 在主仓库旁边,为一个新分支创建独立工作目录
git worktree add ../myproject-ai-task-1 -b ai/refactor-auth

# 现在有两个目录:
#   myproject/            ← 你自己在 main 上工作
#   myproject-ai-task-1/  ← AI 在 ai/refactor-auth 分支上工作
# 两者共享同一个仓库历史,互不干扰

这正是为 AI 编程量身定做的能力——它让「AI 的改动」和「你的改动」在物理上分开。

为什么 AI 编程特别需要它

痛点主工作区直接改用 Worktree
改动归属AI 改动和你的未提交改动混在一起AI 改动全在独立目录/分支,一眼分清
Review Diff要手动区分谁改了什么git diff main 就是 AI 的全部改动
回滚逐个文件确认、容易漏删掉整个 worktree 即可,零残留
并行任务两个任务互相覆盖每个任务一个 worktree,同时跑
你的正常工作AI 跑起来主目录就动不了主目录照常用,AI 在别处忙

尤其「一眼看清 AI 改了什么」这点,直接决定了你 review 的效率和信心——这也是降低 AI 改坏项目风险的关键一环。

完整工作流

1. 为每个任务开一个 worktree

约定一个存放目录(比如项目旁边的 ../worktrees/),分支名带上 ai/ 前缀便于识别:

git worktree add ../worktrees/fix-login -b ai/fix-login
cd ../worktrees/fix-login
# 在这里启动 AI 工具,让它只在这个目录里工作

2. 让 AI 在隔离目录里干活

在 worktree 目录里启动 Claude Code / Cursor / Codex,它的所有读写都发生在这个目录。你的主工作区完全不受影响,可以继续自己的开发,或者再开一个 worktree 跑另一个任务。

3. Review:一条命令看全部改动

任务完成后,AI 的改动就是这个分支相对主分支的全部差异:

git diff main...ai/fix-login          # 看全部改动
git diff main...ai/fix-login --stat   # 先看改了哪些文件、各多少行

没有任何你自己的改动混进来,review 起来干净利落。确认没问题,再决定合并方式。

4. 合并或丢弃

# 满意 → 合并回主分支
cd ../../myproject
git merge ai/fix-login

# 不满意 → 整个丢弃,干干净净
git worktree remove ../worktrees/fix-login
git branch -D ai/fix-login

丢弃是这套流程最爽的部分:AI 改砸了,删掉 worktree 和分支,仓库回到什么都没发生的状态,不用逐个文件 git checkout

开发者审查代码差异
开发者审查代码差异

review 一个 AI 任务就是 `git diff main...分支`——改动边界由 worktree 天然划清。

并行跑多个 AI 任务

Worktree 真正的威力在并行。三个不相关的任务,开三个 worktree,同时让三个 AI 会话各干各的:

git worktree add ../worktrees/task-a -b ai/task-a
git worktree add ../worktrees/task-b -b ai/task-b
git worktree add ../worktrees/task-c -b ai/task-c
# 三个终端 / 三个 AI 会话并行,互不干扰
git worktree list   # 随时查看所有工作目录及其分支

完成后逐个 review、逐个合并或丢弃。这种「一个人管一个 AI 小队」的模式,是目前 AI 辅助开发提效最明显的用法之一。Claude Code 等工具也在往「一键为任务开 worktree」的方向做原生支持,但理解底层的 git worktree 命令能让你不依赖特定工具。

一个简化脚本,把开 worktree 这件事变成一行:

# ai-task.sh:ai-task.sh fix-login  → 建好并进入
name="$1"
git worktree add "../worktrees/$name" -b "ai/$name" && cd "../worktrees/$name"

注意事项与常见坑

  • 依赖要各装一份:worktree 共享 Git 历史,但 node_modules.venv 这类未纳入版本控制的目录不共享,新 worktree 里要重新 npm install。大项目可以考虑 pnpm、依赖软链等方式加速;
  • 同一分支不能被两个 worktree 同时检出:Git 会拦住,这是保护机制,每个 worktree 用自己的分支;
  • 环境配置文件.env、本地配置等被 gitignore 的文件不会自动带过去,需要复制或软链;
  • 清理要用命令:别直接 rm -rf 删 worktree 目录,那样 Git 里会残留登记信息,用 git worktree remove;忘了的话 git worktree prune 清理;
  • 磁盘与端口:并行跑多个任务时注意本地端口冲突(各 worktree 若都要起 dev server 得用不同端口)。
多个终端窗口并行运行任务
多个终端窗口并行运行任务

并行开发时留意依赖安装和端口分配——这是 worktree 工作流最常见的两个绊脚石。

适用人群与替代方案

适合用 AI 工具改代码、且在意改动可控和 review 效率的开发者,尤其是想并行跑多个 AI 任务的人。替代方案有两个:

  • 传统分支 + stash:不开新目录,靠 git stash 和切分支隔离。适合偶尔用一次,但切来切去容易乱,且没法真正并行;
  • 容器/云端隔离:把 AI 放进 Docker 容器或云端沙箱里跑(一些 Agent 平台的做法),隔离更彻底、更安全,代价是环境搭建更重。对本地个人开发,worktree 是성价比最高的选择。

常见问题

Q:Worktree 会让仓库变很大吗? A:不会。所有 worktree 共享同一个 .git 对象库,只多出各自的工作文件。真正占空间的是各自的 node_modules 这类依赖目录,而非 Git 数据。

Q:AI 工具能自动用 worktree 吗? A:越来越多工具在做原生支持(自动为任务创建隔离工作区)。但即便工具支持,理解 git worktree 命令能让你手动掌控、跨工具通用,也方便写自动化脚本。

Q:和直接开多个 clone 有什么区别? A:多个 clone 各有独立仓库,历史不互通,分支要来回 push/pull 同步,还占多份磁盘。Worktree 共享一个仓库,分支和提交天然互通,更轻更快。

小结

Git Worktree 把「AI 的改动」和「你的工作」在物理上隔开:每个任务一个独立目录、一个分支,review 就是一条 git diff,回滚就是删一个目录,还能并行跑多个任务。这套工作流几乎没有学习成本,却能显著提升你用 AI 改代码时的掌控感——毕竟,敢放手让 AI 改的前提,是你随时能看清它改了什么、随时能一键还原。