维护咨询 大模型部署 问题解决 技能定制 大模型训练
你想同时让两个Hermes Agent在同一个项目里工作,但不想互相干扰——A agent改了一个文件,B agent不知道,还继续用旧版本,最后把代码搞乱了。
这是所有多Agent开发都会遇到的问题。Hermes Agent的Git Worktrees支持,就是为了解决这个问题。
## 什么场景需要Git Worktrees
先说清楚为什么需要它。
Hermes Agent把当前工作目录当作项目根目录——你从哪个目录启动,它就在哪个目录里操作文件、读取上下文、执行工具调用。
如果两个Hermes Agent在同一个目录里工作:
第一个Agent重写了一个文件,第二个Agent正在读那个文件的旧版本。
结果:第二个Agent基于过时内容做决策,产出的代码跟新代码不兼容。
两个Agent同时写同一个文件的不同部分。
结果:后写入的把前写入的覆盖了,或者Git报冲突,两边都要手动解决。
这些问题在单人开发里不明显,在并行Agent开发里会大量出现。Git Worktrees的思路是:给每个Agent一个独立的Git分支+独立工作目录,从根本上消除文件冲突。
—
## Git Worktrees是什么
Git Worktrees是Git的内置功能,官方提供,不是Hermes发明的。
正常情况下,一个Git仓库在一个时间点只能检出一个分支。但Worktrees允许你同时检出多个分支到不同目录——它们共享同一个.git目录,但工作文件完全独立。
# 从主仓库创建一个新的worktree
cd /path/to/your/repo
# 创建新分支并检出到 ../repo-feature 目录
git worktree add ../repo-feature feature/hermes-experiment
这会:
– 创建一个新目录:../repo-feature
– 在这个目录里检出一个新分支:feature/hermes-experiment
– 两个目录共享同一个.git历史,但文件互不影响
—
## 在Hermes里使用Worktrees
方式一:手动创建Worktree
# 从主仓库创建worktree
cd /path/to/your/repo
git worktree add ../repo-feature feature/hermes-experiment
# 进入新目录
cd ../repo-feature
# 在这里启动Hermes
hermes
在这个worktree里启动的Hermes会把../repo-feature当作项目根目录,用的分支是feature/hermes-experiment。/rollback命令的checkpoint历史也会独立于主仓库。
方式二:用hermes -w自动Worktree(推荐)
手动创建worktree还要管分支名,hermes -w全自动:
cd /path/to/your/repo
hermes -w
Hermes会自动:
– 在.repo/.worktrees/目录下创建一个临时worktree
– 检出一个隔离的分支(比如hermes/hermes-abc123)
– 在这个worktree里启动完整CLI会话
不需要自己管分支名,不需要手动切目录——一条命令搞定隔离。
单次查询模式:
hermes -w -q "Fix issue #123"
这条命令会创建一个临时worktree,执行完任务后worktree保留(方便查看结果)。
—
## 并行跑多个Agent
这是Git Worktrees最实用的场景。
# 创建两个worktree
cd /path/to/your/repo
git worktree add ../repo-experiment-a feature/hermes-a
git worktree add ../repo-experiment-b feature/hermes-b
现在在两个终端分别启动:
# 终端1
cd ../repo-experiment-a
hermes
# 终端2
cd ../repo-experiment-b
hermes
两个Hermes进程:
– 各自在独立分支上工作(feature/hermes-a vs feature/hermes-b)
– 各自的/rollback checkpoint历史独立,不会互相干扰
– 文件完全隔离,改了A不会影响B
这在以下场景特别有价值:
场景一:批量重构。 同一个项目里同时尝试两种不同的重构方案,看哪个效果更好。
场景二:修复Bug和开发新功能并行。 Bug修复分支和新功能分支同时推进,不互相阻塞。
场景三:对比不同AI模型的代码质量。 两个worktree用不同的模型跑同样的重构任务,对比输出。
—
## 安全的清理流程
Worktree用完之后怎么处理?分两种情况。
情况一:想保留改动
# 正常合并分支
cd /path/to/your/repo
git merge feature/hermes-a
# 然后删除worktree
git worktree remove ../repo-experiment-a
情况二:不想要了,直接删
# 如果有未提交的改动,先确认
cd ../repo-experiment-a
git status
# 强制删除worktree(会丢弃改动)
cd /path/to/your/repo
git worktree remove ../repo-experiment-a --force
注意:git worktree remove不会自动删除分支,branch还在,可以用git branch -d feature/hermes-a单独清理。
另外,Hermes的checkpoint数据(存在~/.hermes/checkpoints/)不会自动清理worktree对应的记录,但这个数据量很小,不需要特别处理。
—
## 结合Checkpoint和Rollback
Git Worktrees和Hermes的/rollback机制是天然搭配。
每个worktree有独立的checkpoint历史,因为checkpoint路径跟worktree的路径哈希挂钩。这意味着:
在worktree A里做了错误的修改,可以用/rollback回退,不会影响worktree B的内容。
# 在worktree A里,错误删除了一段代码
# 回到2次操作之前的状态
/rollback 2
这个回退只在worktree A内生效,不会触发worktree B的任何变化。
—
## 结合Profiles系统
Git Worktrees解决的是”同一个项目里多Agent隔离”的问题。Profiles系统解决的是”不同角色、不同配置的AI互相独立”的问题。
两者可以结合使用:
# Profile "coder" + worktree分支 A
hermes -p coder -w
# Profile "reviewer" + worktree分支 B
hermes -p reviewer -w
每个Profile有独立的人格和记忆,每个Worktree有独立的文件和分支。三重隔离:Profile配置隔离 + Git分支隔离 + 文件系统隔离。
—
## 最佳实践
习惯一:每个实质性任务用单独的worktree。
不要在同一个worktree里同时做多件事。分支命名要描述任务:feature/hermes-checkpoints、feature/refactor-auth、bugfix/login-timeout。
习惯二:用commit做高层次的里程碑。
Hermes的/rollback是工具级安全网,Git commit是任务级里程碑。两层保护:工具改错了/rollback,任务完成就git commit。
习惯三:用hermes -w跑一次性任务更安全。
如果你只是让AI做一个单次任务,用hermes -w -q “…” 创建临时worktree,执行完临时分支保留,方便review。确认结果OK再合并,不OK直接删掉worktree分支。
# 试一下某个重构方案
hermes -w -q "重构用户认证模块"
# 效果不错,合并到主分支
cd /path/to/your/repo
git merge hermes/hermes-abc123
# 删掉临时worktree
git worktree remove .worktrees/hermes-abc123
—
## 常见问题
Q:worktree数量有上限吗?
A:Git本身没有硬性上限,但每个worktree会占用磁盘空间存放工作文件。太多worktree会占用较多磁盘。另外,worktree数量受限于分支数量——每个worktree对应一个分支。
Q:主仓库和worktree可以同时push/pull吗?
A:可以。它们共享同一个.git目录,push/pull操作会同时影响所有worktree的分支。
Q:worktree里的Hermes checkpoint能跨worktree使用吗?
A:不能。checkpoint路径跟worktree路径绑定,worktree删除后checkpoint历史也随之消失。所以commit仍然是长期任务历史的最终存储。
Q:hermes -w创建的worktree保存在哪?
A:默认保存在.repo/.worktrees/目录内。这样所有worktree都集中在一个地方管理,不需要到处分散。
Q:worktree里能接Telegram/Discord Bot吗?
A:能。worktree只影响工作目录和分支,Gateway进程可以正常启动。但不同worktree的Bot最好用不同的Profile+Bot Token,避免冲突。
—
## 相关文章








暂无评论内容