Два агента сразу: по одному 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 и получает то же самое. Что даёт одна ветка на агента:

Автор статьи: Клавдия Кондакова