Два агента сразу: по одному git worktree и одной ветке каждому
Введение
Эта статья — часть большого руководства
OpenCode в Docker на Ubuntu 24.04.
Руководство показывает, как запускать
OpenCode с флагом
--auto внутри контейнера
Docker.
С --auto агент не спрашивает вас перед каждой
командой, поэтому контейнер ограничивает то, до чего он может достать:
агент работает только в одном git worktree, отдельной
копии проекта.
В шаге 2 (worktree для
агента) руководства агент получает свой worktree на своей ветке.
Эта статья запускает так два агента одновременно.
Она же показывает, что ломается, когда оба агента работают на
main.
Два агента одновременно
Пусть в одном контейнере работает OpenCode, а в другом
Claude Code.
Каждый агент получает свой worktree и свою ветку:
git worktree add ../site-opencode -b agent/opencode-about
git worktree add ../site-claude -b agent/claude-index
Вы проверяете и коммитите каждый worktree, а потом сливаете ветки одну за
другой из своей папки.
Проверено на небольшом репозитории, в котором OpenCode поменял
about.php, а Claude Code —
index.php:
git merge agent/opencode-about
Updating e63b53d..952eff2 Fast-forward container/src/about.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
git merge --no-edit agent/claude-index
Merge made by the 'ort' strategy. container/src/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
git log --graph --format=%s
* Merge branch 'agent/claude-index' |\ | * Renames the home page * | Renames the About page |/ * Two pages
Когда оба меняют одну строку
Во втором тесте оба агента меняли заголовок главной страницы, в ветках
agent/opencode-title и
agent/claude-title.
Первое слияние прошло, а второе остановилось и оставило в файле обе
версии:
git merge --no-edit agent/claude-title
Auto-merging container/src/index.php CONFLICT (content): Merge conflict in container/src/index.php Automatic merge failed; fix conflicts and then commit the result.
cat container/src/index.php
<?php <<<<<<< HEAD $title = "Start"; ======= $title = "Main page"; >>>>>>> agent/claude-title echo "<h1>$title</h1>";
Оставьте одну строку, затем git add и
git commit.
Или выполните git merge --abort и отдайте задачу
одному из агентов поверх нового main.
А если оба работают на main?
git worktree add --force всё равно посадит два
worktree на main.
Проверено: worktree OpenCode коммитит новый заголовок страницы About в
main.
В worktree Claude Code, где ничего не делали, этот коммит виден как
подготовленное к коммиту изменение, которое его отменяет:
git -C ../site-claude status --short
M container/src/about.php
Следующий commit -a Claude Code утащит его с собой.
Его коммит «Renames the home page» заодно возвращает старый заголовок
страницы About — без конфликта и без предупреждения:
git -C ../site-claude show --stat --format=%s HEAD
Renames the home page container/src/about.php | 2 +- container/src/index.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
Ваша собственная папка тоже на main и получает то же самое. Что даёт одна ветка на агента:
- Под другой копией ничего не двигается. У каждой ветки свой последний коммит; коммит одного агента не меняет файлы другого.
- Одно ревью и одно слияние на агента, в выбранном вами порядке.
- Столкновение видно при слиянии с обеими версиями, а не как тихая отмена.
- Проваленная задача исчезает целиком: git worktree remove и git branch -D, а main и другой агент остаются как были.
Автор статьи: Клавдия Кондакова