Git Worktree + AI Coding Agent 基础教程:用隔离工作区安全并行开发

Git Worktree + AI Coding Agent 基础教程:用隔离工作区安全并行开发

简介

最近的聊天记录集中在 OpenSpec + Claude Code 协作开发AI 编程代理对比Claude Code 多代理协作 等主题。它们共同遇到一个现实问题:多个 AI Agent 或多个任务同时改同一个仓库时,容易互相覆盖文件、污染依赖环境、产生难以回滚的半成品改动。

git worktree 是 Git 原生命令,可以让一个仓库同时拥有多个独立工作目录,每个目录绑定不同分支。把它和 Claude Code、Codex、OpenCode、Hermes 子代理等 AI Coding Agent 结合,就能实现:

  • 一个任务一个分支、一个工作区;
  • 多个 Agent 并行开发而不抢同一份文件;
  • 主仓库保持干净,方便审查、测试和合并;
  • 失败任务可以直接删除工作区,不影响其他任务。

本文是基础篇,重点讲清楚概念、初始化和单任务隔离工作流。进阶并行编排请看:Git Worktree + AI Agent 并行实战与冲突收敛

前置要求

  • 已安装 Git,建议版本不低于 2.30
  • 已有一个使用 Git 管理的项目仓库。
  • 理解基本命令:git statusgit branchgit checkoutgit merge
  • 可选:已安装 Claude Code、Codex CLI、OpenCode 或其他 AI 编程代理。
  • 项目最好有可运行的测试命令,例如 npm testpytestgo test ./...

检查环境:

1
2
git --version
git status

详细步骤

1. 理解 worktree 的目录模型

普通 Git 仓库通常只有一个工作目录:

1
2
3
my-app/
.git/
src/

使用 git worktree 后,可以在同一个仓库外侧创建多个工作目录:

1
2
3
4
5
projects/
my-app/ # 主工作区,通常保持 main
my-app-wt-login/ # feature/agent-login
my-app-wt-api/ # feature/agent-api
my-app-wt-docs/ # feature/agent-docs

这些目录共享同一个 Git 对象数据库,但每个目录有自己的分支、索引和工作区文件。因此,一个 Agent 在 my-app-wt-login 中修改登录逻辑,不会影响另一个 Agent 在 my-app-wt-api 中修改 API。

2. 保持主工作区干净

进入主仓库,确认没有未提交改动:

1
2
cd ~/projects/my-app
git status --short

如果有未提交改动,先提交或暂存:

1
2
git add .
git commit -m "chore: save current work before creating worktrees"

⚠️ 不建议在主工作区一边手工开发,一边让多个 Agent 在 worktree 中开发。主工作区最好只承担:拉取最新代码、创建分支、合并结果、发布版本。

3. 为单个 AI 任务创建独立 worktree

假设要让 Agent 修复登录超时问题:

1
2
3
4
5
6
cd ~/projects/my-app
git fetch origin
git switch main
git pull --ff-only

git worktree add -b feature/agent-login-timeout ../my-app-wt-login-timeout main

命令含义:

片段 作用
git worktree add 创建新的工作区
-b feature/agent-login-timeout 同时创建并切换到新分支
../my-app-wt-login-timeout 新工作区目录
main 从 main 的当前提交派生

进入新目录检查:

1
2
3
cd ../my-app-wt-login-timeout
git branch --show-current
git status --short

4. 在 worktree 中运行 AI Coding Agent

在隔离目录中启动 Agent,并明确告诉它只能修改当前目录:

1
2
cd ~/projects/my-app-wt-login-timeout
claude

可以给 Agent 的任务描述:

1
2
请只在当前 worktree 中工作。任务:修复登录接口在 token 过期时返回 500 的问题。
要求:先阅读相关测试;新增或修改测试复现问题;修复后运行 npm test;最后总结改动文件和验证结果。

如果使用 Codex 或其他 CLI,原则相同:先进入对应 worktree,再启动 Agent

5. 人工审查并提交

Agent 完成后,不要立即合并。先检查变更:

1
2
3
git status --short
git diff --stat
git diff

运行项目测试:

1
2
npm test
# 或 pytest / go test ./... / pnpm test

确认无误后提交:

1
2
git add .
git commit -m "fix: handle expired login token"

6. 合并回主分支

回到主工作区合并:

1
2
3
4
cd ~/projects/my-app
git switch main
git pull --ff-only
git merge --no-ff feature/agent-login-timeout

如果项目使用 Pull Request 流程,可以推送分支:

1
git push -u origin feature/agent-login-timeout

然后在 GitHub/GitLab 上创建 PR。

7. 清理 worktree

合并后删除临时工作区:

1
2
3
cd ~/projects/my-app
git worktree remove ../my-app-wt-login-timeout
git branch -d feature/agent-login-timeout

如果目录被手工删除过,Git 仍保留登记信息,可以清理:

1
git worktree prune

代码示例

下面脚本会在临时目录中创建一个仓库、添加一个 worktree、提交改动并合并回主分支。它适合用来验证你的 Git 环境是否支持本文流程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env bash
set -euo pipefail

ROOT="$(mktemp -d)"
cd "$ROOT"

git init demo-app
cd demo-app
git config user.name "Tutorial Bot"
git config user.email "tutorial@example.com"

echo 'console.log("hello")' > app.js
git add app.js
git commit -m "init: create demo app"
git branch -M main

# 创建隔离工作区
git worktree add -b feature/change-message ../demo-app-wt-message main

# 在 worktree 中修改并提交
cd ../demo-app-wt-message
printf 'console.log("hello from worktree")\n' > app.js
git add app.js
git commit -m "feat: update message in worktree"

# 回主工作区合并
cd ../demo-app
git merge --no-ff feature/change-message -m "merge: feature/change-message"
node app.js

git worktree remove ../demo-app-wt-message
echo "demo finished in $ROOT"

预期输出包含:

1
2
hello from worktree
demo finished in /tmp/...

常见问题

1. worktree 和 clone 有什么区别?

clone 会复制完整仓库,适合完全独立的长期副本;worktree 共享 Git 对象数据库,创建速度快、占用空间小,更适合一个本地仓库内的多分支并行开发。

2. 一个分支能同时被两个 worktree 使用吗?

不能。Git 会阻止同一个分支被多个 worktree 同时签出,这是为了避免索引和工作区状态冲突。每个任务都应该使用独立分支。

3. AI Agent 在 worktree 里安装依赖会影响主仓库吗?

取决于依赖目录是否在工作区内。node_modules.venv 如果放在当前 worktree 目录下,通常互不影响;如果使用全局缓存,例如 pnpm store、pip cache,则会共享缓存但不共享源码改动。

4. worktree 删除失败怎么办?

先确认没有终端、编辑器或 Agent 进程正在占用该目录。必要时退出相关进程,再运行 git worktree remove <path>。如果目录已不存在,运行 git worktree prune

5. Agent 改坏了代码,如何快速回滚?

如果还没提交,直接删除 worktree 即可:git worktree remove --force <path>。如果已经提交但未合并,删除分支即可:git branch -D <branch>

6. OpenSpec 任务适合放进 worktree 吗?

适合。推荐一个 OpenSpec 变更对应一个 worktree:规格、任务清单、代码和测试全部在同一分支完成,审查时能看到从设计到实现的完整变更。

小结

git worktree 给 AI 编程带来的最大价值不是”多开目录”,而是把 Agent 的不确定性封装到可审查、可丢弃、可合并的边界里。掌握本文的单任务隔离流程后,就可以进一步把多个 worktree 分配给多个 Agent 并行执行。