引言:等待 AI 的时间浪费
如果你已经开始使用 Claude Code 进行开发,一定遇到过这样的场景:
- 场景 1: 让 AI 分析一个复杂的 Bug,你坐在电脑前等了 5 分钟,AI 还在读代码...
- 场景 2: 让 AI 重构一个大模块,15 分钟过去了,你刷完了朋友圈,AI 还在工作...
- 场景 3: 临时有个紧急 Bug 要修,但 AI 正在实现另一个功能,你该打断它还是继续等?
本质问题:单终端开发模式让你变成了"AI 的陪跑员"------大量时间花在等待上,开发效率反而下降了。
💡 解决方案:多终端并发
想象一下这样的工作方式:
- 终端 1: AI 正在分析内存泄漏问题
- 终端 2: 同时实现新的登录功能
- 终端 3: 编写单元测试用例
- 你的手机: 收到通知"内存泄漏分析完成",立即切换回去查看
三个 AI "队友"同时工作,你只需要在任务完成时切换过去验收成果。效率提升 2-3 倍不是梦想。
本文核心内容:
- Git Worktree 详解 - 多终端并发的基础设施
- Claude Code 多会话机制
- Android 开发的实战案例
"Git Worktree:让多个分支同时活跃,AI 并行工作的基础设施"
一、为什么需要多终端并发?
1.1 单终端开发的效率瓶颈
让我们用数据说话,看一个典型的 Android 功能开发流程:
markdown
串行开发(单终端):
需求分析(AI) → 10 分钟
架构设计 → 15 分钟
实现登录界面 → 20 分钟
实现后端接口 → 25 分钟
编写单元测试 → 15 分钟
修复Bug → 10 分钟
----------------------------
总耗时: 95 分钟 (~1.5 小时)
问题分析:
- 每个阶段都要等待前一个阶段完成
- 大量时间花在等待 AI 生成代码和分析
- 紧急任务无法插队,只能等待或打断
1.2 多终端并发的效率提升
同样的任务,使用多终端并发:
makefile
串行部分(必须按顺序):
需求分析(AI) → 10 分钟
架构设计 → 15 分钟
并行开发(基于架构设计):
终端1: 实现登录界面(同时进行) → 20 分钟
终端2: 实现后端接口(同时进行) → 25 分钟
并行测试和Bug修复(开发完成后):
终端1: 编写单元测试(开发完成后) → 15 分钟
终端2: 修复Bug1(发现问题) → 10 分钟
终端3: 修复Bug2(同时进行) → 8 分钟
----------------------------
总耗时: 10 + 15 + 25(最长) + 15(最长) = 65 分钟 (~1.1 小时)
效率对比:
- 串行: 95 分钟
- 并行: 65 分钟
- 提升幅度: 1.5 倍 ✨
关键点:
- 需求分析和架构设计必须串行,确保方向正确
- UI和后端开发可以并行,前提是接口已定义
- 测试必须在开发完成后进行
- 多个Bug修复可以并行处理
1.3 并行开发的核心挑战
虽然并行开发能大幅提升效率,但在同一个代码工程中并行工作会遇到一个关键问题:
问题: 如果多个终端同时修改同一个文件,就会产生 Git 冲突。
例如:
- 终端1 在
feature/login分支修改LoginActivity.kt - 终端2 在
feature/payment分支也修改LoginActivity.kt - 合并时会产生冲突,需要手动解决
传统解决方案的局限:
- 使用
git checkout切换分支: 只能同时工作在一个分支上 - 切换分支需要重新编译,浪费时间
- 未提交的修改会阻止切换
解决方案 : 使用 Git Worktree 让多个分支同时活跃,每个分支有独立的工作目录,避免文件冲突。
二、基础设施:Git Worktree 详解
2.1 什么是 Git Worktree?
Git Worktree 是 Git 2.5+ 引入的功能(现代 Git 版本都支持),允许你同时检出多个分支到不同的目录,每个工作目录可以独立编译和运行,互不干扰。
传统方式 vs Worktree
传统分支切换:
bash
# 只有一个工作目录
my-project/
├── src/
├── build/
└── .git/
# 切换分支会改变工作目录内容
git checkout feature-login # 工作目录变成 login 分支内容
git checkout feature-payment # 工作目录变成 payment 分支内容
问题:
- 只能同时工作在一个分支上
- 切换分支需要重新编译
- 未提交的修改会阻止切换
Worktree 方式:
bash
# 多个工作目录同时存在
my-project/ # 主分支(main)
├── src/
├── build/
└── .git/
my-project-login/ # login 分支
├── src/
├── build/
└── .git/ # 软链接到主仓库
my-project-payment/ # payment 分支
├── src/
├── build/
└── .git/ # 软链接到主仓库
优势:
- ✅ 多个分支同时活跃
- ✅ 无需切换分支,无需重新编译
- ✅ 每个分支独立运行 Claude Code
- ✅ 共享同一个 Git 仓库,节省磁盘空间
2.2 Worktree 基本使用
创建 Worktree
bash
# 语法
git worktree add <path> <branch>
# 示例:创建 feature-login 分支的 worktree
git worktree add ../my-app-login -b feature-login
# 示例:从远程分支创建
git worktree add ../my-app-payment -b feature-payment origin/feature-payment
参数说明:
<path>: Worktree 目录路径(建议使用绝对路径或相对于仓库根目录的路径)<branch>: 分支名称-b: 创建新分支(如果分支已存在,省略此参数)
查看所有 Worktree
bash
git worktree list
# 输出示例:
# /home/user/projects/my-app abc123 [main]
# /home/user/projects/my-app-login def456 [feature-login]
# /home/user/projects/my-app-payment ghi789 [feature-payment]
删除 Worktree
bash
# 方法1:删除目录后清理 (推荐)
rm -rf ../my-app-login
git worktree prune
# 方法2:使用 git worktree remove (Git 2.17+)
git worktree remove ../my-app-login
# 强制删除(即使有未提交的修改)
git worktree remove -f ../my-app-login
其他常用命令
bash
# 移动 worktree 到新位置
git worktree move <old-path> <new-path>
# 锁定 worktree (防止被 prune 删除)
git worktree lock <path>
# 解锁 worktree
git worktree unlock <path>
2.3 推荐的目录结构
对于 Android 项目,推荐以下目录组织方式:
bash
~/AndroidProjects/
├── MyApp/ # 主工作目录 (main 分支)
│ ├── app/
│ ├── gradle/
│ └── .git/
│
├── MyApp-feature-login/ # 登录功能 worktree
│ ├── app/
│ └── .git -> ../MyApp/.git
│
├── MyApp-feature-payment/ # 支付功能 worktree
│ ├── app/
│ └── .git -> ../MyApp/.git
│
└── MyApp-bugfix-memory/ # Bug 修复 worktree
├── app/
└── .git -> ../MyApp/.git
命名规范建议:
bash
# 功能开发
<项目名>-feature-<功能名>
# Bug 修复
<项目名>-bugfix-<问题描述>
# 重构任务
<项目名>-refactor-<模块名>
# 测试用例
<项目名>-test-<模块名>
2.4 Worktree 的工作原理

Git Worktree 通过符号链接共享 Git 对象数据库:
bash
主仓库 MyApp/.git/
├── objects/ # 所有对象数据(共享)
├── refs/ # 所有引用(共享)
├── config # 仓库配置(共享)
└── worktrees/ # Worktree 元数据
├── MyApp-login/ # 记录 worktree 位置和分支
└── MyApp-payment/
Worktree MyApp-login/
├── app/ # 工作目录
└── .git # 文件,内容: gitdir: ../MyApp/.git/worktrees/MyApp-login
核心机制:
- 所有 worktree 共享同一个对象数据库(objects/)
- 每个 worktree 有独立的工作目录和 HEAD
- 提交操作会更新共享的对象数据库
- 磁盘占用仅增加工作目录大小,不重复存储 Git 数据
2.5 Worktree 的注意事项
⚠️ 注意文件冲突风险,使用 Claude Code 辅助解决
Git Worktree 允许在不同分支并行开发,但仍然需要注意文件冲突的风险。如果多个分支修改了同一个文件,合并时会产生冲突。
bash
# 示例:两个 worktree 都修改 LoginActivity.kt
终端1 (MyApp-login): 在 feature/login 分支修改 LoginActivity.kt
终端2 (MyApp-payment): 在 feature/payment 分支也修改 LoginActivity.kt
# 合并时会产生冲突,需要处理
重要说明:
- Git Worktree 本身无法解决冲突,它只是提供了并行开发的能力
- 冲突仍然需要手动或工具辅助解决
- Claude Code 可以辅助解决冲突,理解代码语义,减少人工处理的工作量
使用 Claude Code 处理冲突:
bash
# 合并 feature/login 到 main
cd ~/AndroidProjects/MyApp
git checkout main
git merge feature/login
# 如果有冲突,使用 Claude Code 辅助解决
claude
# 输入提示词来让ClaudeCode自动处理
AI: 分析冲突...已智能合并,保留了登录和支付功能,请确认是否符合预期
最佳实践:
- 尽量规划任务,减少文件重叠修改
- 如果必须修改公共文件,及时合并,避免差异过大
- 使用 Claude Code 辅助解决冲突,提高效率
✅ 定期同步和合并
在功能完成时及时合并回主分支,防止差异过大之后合不进去
⚠️ 及时清理无用的 Worktree
bash
# 定期检查
git worktree list
# 删除已完成任务的 worktree
git worktree remove MyApp-feature-login
# 清理过期引用
git worktree prune
三、Claude Code 的多终端支持
3.1 会话隔离机制
Claude Code 支持多个独立会话,每个会话有:
- 独立的上下文历史
- 独立的 Token 计数
- 独立的任务队列
启动独立会话
bash
# 示例:在不同 worktree 中启动不同会话
cd ~/AndroidProjects/MyApp-login
claude
cd ~/AndroidProjects/MyApp-payment
claude
恢复之前的会话
bash
# 恢复会话(自动加载上下文)
claude -c
# 列出所有会话,选择恢复
claude -r
3.2 任务完成通知
多终端并发时,你无法实时监控每个终端。建议配置任务完成通知,让你在任务完成时及时收到提醒。
配置方法 : 参考第 5 篇文章中的 Hook 机制,配置 task-complete Hook 来实现任务完成通知。详细配置步骤和脚本示例请参考第 5 篇。
四、实战案例: AOSP Music 应用多需求并行开发
背景
以 AOSP 原生 Music 应用为例,需要同时开发两个功能:
- 需求 A: 添加时长显示功能 - 在播放界面显示当前播放时长和总时长
- 需求 B: 添加音频焦点请求结果处理 - 处理音频焦点请求成功/失败的回调
传统串行开发预计需要 90 分钟。
任务分解
bash
# 1. 准备 AOSP Music 应用代码库
cd ~/aosp/packages/apps/Music
# 确保代码库已同步到最新
# 2. 创建两个 Worktree 用于并行开发
git worktree add ../Music-feature-a -b feature-a
git worktree add ../Music-feature-b -b feature-b

bash
# 3. 启动 2 个 Claude Code 会话
# 终端1: 需求 A
cd ../Music-feature-a
claude
# 终端2: 需求 B
cd ../Music-feature-b
claude
并行开发流程
终端 1 (需求 A: 时长显示功能):

终端 2 (需求 B: 音频焦点请求结果处理):

合并代码和提交代码
遵循代码提交的原则,每笔提交要求保证功能的原子化。我们先合并需求A的代码到本地主线分支并提交,再合并需求B的代码。如果需求A和B有关联,需要合并测试,则根据实际情况调整。
首先处理需求A的修改:
bash
# 在feature-a分支提交需求A的修改
cd ../Music-feature-a
git status .
# 添加需要提交的代码
git add .
git commit -m "feat: 添加时长显示功能"
合并回主分支:
bash
# 返回主仓库
cd ../Music
# 合并功能分支
git checkout master
git merge feature-a
然后处理需求B的修改:
bash
# 在feature-b分支提交需求B的修改
cd ../Music-feature-b
git status .
# 添加需要提交的代码
git add .
git commit -m "feat: 添加音频焦点请求结果处理"
合并回主分支:
bash
# 返回主仓库
cd ../Music
# 合并功能分支
git checkout master
git merge feature-b
这一步可能会出现feature-b和feature-a修改的代码冲突,需要解决冲突。
使用 Claude Code 自动化处理
使用ClaudeCode
以上过程大家也看出来了,多多少少还是有些麻烦的,而且要记好几条命令,这个年代了代码都AI写了,还让我们人工处理提交和合并,这不就是我们给AI打工了。不行,万万不行。 果断起一个claude会话,让它来处理。

如果这两个worktree空间不需要了,也可以直接让ClaudeCode清除掉空间和分支。
五、最佳实践与经验总结
5.1 Worktree 管理最佳实践
命名规范
bash
# 推荐的命名模式
<项目名>-<类型>-<简短描述>
# 示例
MyApp-feature-login # 功能开发
MyApp-bugfix-crash # Bug 修复
MyApp-refactor-network # 重构任务
MyApp-test-unit # 测试用例
MyApp-hotfix-security # 紧急修复
定期清理
bash
# 每周检查 Worktree 列表
git worktree list
# 删除已合并的 Worktree
git worktree remove MyApp-feature-login
# 清理无效引用
git worktree prune
# 批量清理 (慎用!)
for wt in $(git worktree list --porcelain | grep "worktree" | cut -d' ' -f2); do
if [ "$wt" != "$(pwd)" ]; then
git worktree remove "$wt" 2>/dev/null || echo "Skipped: $wt"
fi
done
5.2 效率提升 Checklist
在开始多终端开发前,检查以下事项:
- 任务已拆分: 明确各任务的边界和接口
- Worktree 已创建: 每个任务有独立工作目录
- 会话已隔离: 每个 Worktree 启动独立 Claude Code 会话
- 通知已配置: task-complete Hook 已设置
- 依赖已梳理: 清楚哪些任务可以并行
- 资源已确认: 确保机器有足够内存和 API 配额
- 合并策略已定: 知道如何合并多个分支
- 冲突方案已备: 准备好处理潜在冲突
六、参考资料
🔗 相关文章:
如果这篇文章对你有帮助,欢迎点赞、收藏、分享!有任何问题或建议,欢迎在评论区留言讨论。让我们一起学习,一起成长!
也欢迎访问我的个人主页发现更多宝藏资源