Инженерия

Работа с Git worktrees в Rox

Как Rox использует Git worktrees для запуска нескольких ИИ-агентов для кода в параллель без конфликтов. Практическое руководство по рабочему процессу, который позволяет увеличить пропускную способность в 10 раз.

Kiet Ho
Kiet HoСооснователь ·

Запускать один ИИ-агент для кода полезно. Запускать десять разом — совсем другая игра. Но запуск десяти агентов в одной рабочей директории — катастрофа: они наступают друг другу на файлы, создают конфликты слияния прямо посреди редактирования и оставляют твою кодовую базу в непредсказуемом состоянии.

Rox решает это с помощью Git worktrees. Каждый агент получает свою ветку и свою копию рабочей директории, и всё это опирается на одно и то же хранилище объектов Git. Никакого дублирования, никаких конфликтов, никакого хаоса. Этот пост проходит по тому, как это работает на практике.


Почему worktrees важны для оркестрации агентов

Когда ты запускаешь агента для кода вроде Claude Code или Codex, агент читает файлы, пишет код и выполняет команды. Если два агента попытаются редактировать один файл одновременно, ты получишь повреждённое состояние. Если они делят область индекса, коммиты перепутываются.

Git worktrees устраняют эту проблему на уровне файловой системы. Каждый worktree — это отдельная выгрузка со своими:

  • Рабочей директорией — файлы на диске, которые агент может читать и менять
  • Веткой — изолированной ссылкой, отслеживающей изменения агента
  • Индексом — отдельной областью индекса для коммитов

Что общее для всех worktrees:

  • Хранилище объектов — коммиты, деревья и blob'ы существуют ровно один раз
  • Ссылки — ветки, созданные в одном worktree, видны во всех остальных
  • Конфиг — настройки репозитория, remote'ы, хуки

Это значит, что создание нового worktree быстро (секунды, не минуты) и дёшево (мегабайты, не гигабайты). Ты не клонируешь репозиторий — ты выгружаешь ещё одну копию файлов, разделяя при этом всю историю.


Рабочий процесс Rox

Вот что происходит, когда ты создаёшь новую задачу в Rox:

1. Создай задачу

Ты описываешь, что хочешь сделать, — «добавить валидацию ввода на форму регистрации» или «отрефакторить сервис оплаты под новый API». Rox создаёт новый Git worktree и выгружает свежую ветку.

2. Агент работает в изоляции

Агент выполняется внутри своего worktree. Он может:

  • Читать и записывать любой файл
  • Устанавливать зависимости
  • Запускать сборки и тесты
  • Делать коммиты в свою ветку

Тем временем твоя основная рабочая директория не тронута. Ты можешь продолжать кодить, гонять свой dev-сервер или создавать новые задачи — каждую в своём worktree.

3. Посмотри diff

Когда агент заканчивает, Rox показывает тебе diff всего, что он изменил. Встроенный просмотрщик diff'ов подсвечивает добавления, удаления и изменения по всем файлам. Ты также можешь открыть worktree в своём редакторе (VS Code, Cursor, JetBrains, Xcode), чтобы изучить изменения в полном контексте.

4. Смержи или итерируй

Если изменения выглядят хорошо, смержи ветку. Если нет — дай агенту обратную связь и позволь ему итерировать, всё так же в своём worktree, всё так же изолированно от всего остального.


Запуск нескольких агентов в параллель

Настоящая сила worktrees проявляется, когда ты запускаешь несколько агентов одновременно. Вот типичная сессия:

У каждой задачи свои worktree и ветка. Агент 1 не может случайно сломать работу Агента 2. Когда Агент 3 заканчивает, ты ревьюишь его diff, пока остальные продолжают работать. Никакого ожидания, никаких конфликтов, никакого переключения контекста между стэшами.

Как Rox управляет параллелизмом

Постоянный демон Rox управляет всеми сессиями агентов через Unix-domain-сокеты. Эта архитектура означает:

  • Сессии переживают падения — закрой и снова открой Rox, твои агенты всё ещё работают
  • Планирование по приоритетам — сфокусированная панель получает все ресурсы, фоновые вкладки подгружаются постепенно
  • Никаких помех — терминальная сессия каждого агента полностью независима

Практические советы

Начинай с малого, масштабируй постепенно

Начни с 2–3 параллельных агентов, чтобы освоиться с рабочим процессом ревью. По мере того как ты обретаешь уверенность в быстром ревью diff'ов, масштабируй. Большинство разработчиков находят золотую середину около 5–7 одновременных агентов, прежде чем ревью становится узким местом.

Выбирай правильного агента под каждую задачу

У разных агентов разные сильные стороны. Rox агентонезависим — используй то, что лучше всего подходит для работы:

  • Claude Code — силён в сложных рефакторах, архитектурных изменениях и правках по нескольким файлам
  • Codex — быстр для чётко очерченных задач с ясными спецификациями
  • Aider — хорош для итеративных изменений с плотной обратной связью
  • OpenCode — гибок с 75+ провайдерами моделей, отлично подходит для оптимизации стоимости

Организуй свои задачи

Давай каждой задаче ясное, конкретное описание. «Почини баги» слишком расплывчато. «Почини исключение разыменования null в UserService.getProfile, когда у пользователя нет аватара» даёт агенту достаточно контекста, чтобы работать самостоятельно.

Ревьюй diff'ы, а не код

Когда агент заканчивает, не перечитывай весь файл. Сосредоточься на diff'е. Встроенный просмотрщик diff'ов Rox показывает ровно то, что изменилось. Если изменение трогает файлы, которых ты не ожидал, — это стоит изучить. Если оно ограничено тем, что ты просил, быстрого ревью обычно достаточно.

Подчищай завершённые worktrees

После слияния удаляй worktree. Rox делает это автоматически, когда ты закрываешь завершённую задачу, но держать список worktrees чистым — хорошая привычка. Старые worktrees не влияют на производительность, но засоряют список.


Worktrees против других методов изоляции

Почему worktrees, а не контейнеры, VM или отдельные клоны?

| Метод | Время настройки | Стоимость по диску | Общая история | Рабочий процесс слияния | |---|---|---|---|---| | Git worktrees | Секунды | Низкая (общие объекты) | Да | Нативный git merge | | Отдельные клоны | Минуты | Высокая (полная копия репозитория) | Нет (отдельные remote'ы) | Push/pull между репозиториями | | Docker-контейнеры | Минуты | Средняя (слои образа) | Зависит от монтирования | На основе томов, сложно | | VM | Минуты | Высокая (полная ОС) | Нет | По сети, медленно |

Worktrees выигрывают по каждой оси, важной для агентов кода: их быстро создавать, они дёшевы по диску, нативно делят историю git и используют стандартное слияние git. Агент не знает и не заботится о том, что он в worktree, — он просто видит обычный репозиторий git.


Когда worktrees недостаточно

Worktrees изолируют файлы и ветки, но делят рантайм-окружение. Если двум агентам обоим нужно запустить npm install с конфликтующими зависимостями, они всё равно столкнутся на уровне системы. Для полной изоляции окружения ты бы наслоил контейнеры поверх worktrees — но для подавляющего большинства задач по коду изоляции на уровне worktree достаточно и она радикально проще.

Другое ограничение — правило одной ветки: Git не позволяет выгружать одну и ту же ветку в несколько worktrees одновременно. На самом деле это фича — она предотвращает ровно тот класс багов, который порождает параллельная работа. Rox по умолчанию обеспечивает уникальные ветки на каждую задачу.


С чего начать

Если ты уже используешь CLI-агента для кода, добавить Rox займёт около двух минут:

  1. Скачай Rox с rox.one
  2. Открой свой проект — Rox обнаруживает твой репозиторий git автоматически
  3. Создай задачу — опиши, что хочешь сделать, выбери агента
  4. Смотри, как он работает — агент выполняется в своём worktree, пока ты продолжаешь кодить

В первый раз, когда ты увидишь, как три агента работают в параллель — каждый в своей ветке, никто не мешает другому, — рабочий процесс щёлкнет. Это не в три раза быстрее (ревью всё ещё идёт на человеческой скорости), но пропускная способность здесь радикально выше, чем при запуске агентов по одному.

Git worktrees есть в Git с 2015 года. Их задумывали для мира, где людям нужно было работать над несколькими ветками. Оказалось, они ещё полезнее в мире, где код пишут ИИ-агенты.