Модуль 3 · Параллельная работа · урок 13 из 17
Несколько задач параллельно: worktree
Пока агент полчаса делает задачу, вы можете заниматься другой. Но если оба работают в одной папке, получается каша: агент переключает ветку под вами, ваши правки попадают в его коммит, тесты падают из-за чужих изменений. В рекомендациях Codex это отдельный пункт среди типичных ошибок: параллельные задачи в одних и тех же файлах без worktree. Разберём, как устроены worktree, как с ними работает Codex и что нужно, чтобы во втором рабочем каталоге проект действительно запускался.
Что такое worktree
Git worktree — это вторая (третья, десятая) рабочая копия того же репозитория. У каждой свои файлы, но история, ветки и объекты общие: каталог .git один. Поэтому worktree создаётся за секунды и не требует повторного клона.
git worktree add ../site-task-1042 -b task-1042 main
git worktree list
git worktree remove ../site-task-1042Главное ограничение: одна ветка может быть выгружена только в одном месте. Если task-1042 открыта в worktree, переключиться на неё в основной копии не получится — Git ответит, что ветка уже используется. Это не баг, а защита: две рабочие копии не должны двигать одну ветку одновременно.
Самый простой способ работать с Codex в worktree — создать его вручную и запустить агента там:
cd ../site-task-1042 && codexWorktree в ChatGPT desktop
В режиме Codex в ChatGPT desktop worktree встроены в интерфейс. При создании чата выбираете под полем ввода Worktree и ветку, от которой стартовать, — основную, свою текущую или даже ветку с незакоммиченными изменениями: они будут перенесены в новую копию.
Как это устроено:
- Codex создаёт worktree в
$CODEX_HOME/worktrees(каталог можно сменить в настройках) и по умолчанию держит его в состоянии detached HEAD, то есть без ветки. Так можно плодить worktree, не засоряя список веток. - Когда результат вас устраивает, есть два пути. Первый — Create branch here: превратить worktree в ветку, закоммитить, запушить и открыть MR прямо оттуда. Второй — Hand off в Local: перенести чат вместе с кодом в основную копию, чтобы посмотреть изменения в своей IDE и на своём dev-сервере. Перенос работает и в обратную сторону: если чат в Local мешает, отправьте его в фон.
- Управляемые worktree считаются одноразовыми. По умолчанию приложение хранит последние 15 и удаляет старые, но не трогает закреплённые чаты, чаты в работе и постоянные worktree. Перед удалением Codex сохраняет снимок, и чат можно восстановить.
- Для долгоживущей копии — например, под ветку релиза — есть постоянный worktree: он создаётся из меню проекта и становится отдельным проектом.
Подробности — на странице Worktrees в документации.
Worktree в CLI
В CLI управляемый worktree можно получить несколькими способами:
codex --worktree # новая сессия в новом worktree
codex fork <SESSION_ID> --worktree # ответвить сессию в отдельную копию
codex exec --worktree "реализуй следующий шаг" # неинтерактивный запускВнутри уже идущей сессии команда /worktree предложит начать новый чат или продолжить текущий в новом worktree, а пункт Browse worktrees покажет существующие копии и их чаты. Пока агент выполняет задачу, команда недоступна. Если флаги в вашей версии называются иначе, сверьтесь с codex --help.
Что не переезжает в новую копию
Worktree содержит только то, что лежит в git. Всё игнорируемое — .env, vendor/, node_modules/, собранные ассеты, локальные конфиги — в новой копии отсутствует. Агент запускает тесты, видит «Class not found» и начинает «чинить» проект, который просто не установлен.
Для управляемых worktree ChatGPT desktop есть файл .worktreeinclude в корне репозитория: в нём перечисляются игнорируемые файлы, которые нужно скопировать в новую копию. Отслеживаемые git файлы туда не пишут. Игнорируемый AGENTS.override.md копируется автоматически.
.env
src/.env
.env.testingЗависимости копировать не стоит, их ставят заново. В ChatGPT desktop для этого есть локальное окружение (local environment) проекта: скрипт подготовки, который запускается при создании worktree, и действия (actions) — кнопки для частых команд вроде запуска dev-сервера или тестов. Настройки хранятся в папке .codex в корне проекта, их можно закоммитить для всей команды. Для CLI и ручных worktree держите такой же скрипт в репозитории и упомяните его в AGENTS.md:
#!/usr/bin/env bash
set -euo pipefail
composer install --no-interaction --prefer-dist
npm ci
npm run buildОтдельный стенд на каждую задачу
Для веб-проекта на Docker поставить зависимости мало. Основной стенд на localhost:8001 смонтирован на основную копию и изменений из worktree не видит. Агент делает правку в worktree, открывает 8001, видит старую страницу и делает вывод, что правка «не применилась».
Что нужно предусмотреть:
- Порт и имя проекта. Второй стенд поднимается на другом порту и под другим именем Docker Compose-проекта, чтобы контейнеры не конфликтовали. Удобно, когда
docker-compose.ymlчитает порт из переменной, а скрипт подготовки выбирает свободный. - База данных. Если оба стенда смотрят в одну базу, миграция в одном worktree ломает другой. Каждой задаче — своя база или копия.
- Инструкция агенту. В AGENTS.md прямо напишите: «в worktree стенд на 8001 недоступен, подними свой командой … и проверяй на его порту».
В мобильных проектах похожая история с симуляторами и эмуляторами: две параллельные сборки на одном устройстве перезаписывают друг друга. Сразу назначайте каждой задаче своё устройство.
OpenAI в своём эксперименте с разработкой силами агентов поднимала отдельный экземпляр приложения на каждый worktree, вместе с логами и метриками (статья о harness engineering). Как к этому прийти, разбираем в уроке Изолированные окружения на каждую задачу.
Сколько задач вести одновременно
Ограничение тут не в Codex, а в вас. Каждую задачу нужно поставить, ответить на вопросы агента и проверить результат. На практике две-три параллельные задачи плюс своя работа на переднем плане — разумный предел. Дальше вы перестаёте внимательно читать диффы, а это хуже, чем работать последовательно.
Ещё одно ограничение — диск. Каждый worktree — полный набор файлов, зависимостей и кэшей сборки. Закрытые задачи убирайте: git worktree remove для ручных копий, архивирование чата — для управляемых.
Попробуйте сами
10–15 мин на рабочем месте- Создайте вручную worktree для небольшой задачи, запустите в нём
codexи попросите агента прогнать тесты. Запишите, чего не хватило:.env, зависимостей, базы. - По итогам напишите
scripts/worktree-setup.shили скрипт подготовки локального окружения в ChatGPT desktop и, если нужно,.worktreeinclude. Проверьте на втором worktree, что тесты проходят без ручных действий. - Добавьте в AGENTS.md раздел о том, как поднять стенд из worktree и на каком адресе его проверять.
Коротко
- Параллельные задачи в одной рабочей копии мешают друг другу; worktree даёт каждой свой каталог при общей истории.
- Одна ветка — одно место; в ChatGPT desktop worktree стартуют без ветки, а дальше Create branch here или Hand off в Local.
- В CLI есть
--worktree,codex fork --worktreeи/worktree. - Игнорируемые файлы и зависимости в новую копию не попадают:
.worktreeincludeи скрипт подготовки решают это один раз. - Веб-проекту нужен свой стенд и своя база на каждый worktree, иначе агент проверяет не тот код.