Git остаётся главным механизмом контроля изменений, и Codex не пытается его заменить. Сессии хранят контекст, checkpoints помогают откатиться внутри работы, но настоящая история, ветвление и review живут в git. Managed worktree - это способ дать нескольким чатам работать параллельно, не конфликтуя в одном checkout: каждый получает отдельный рабочий каталог и состояние ветки. Это лучшая основа для параллельной работы именно потому, что деревья физически не пересекаются.
Смысл worktree в изоляции без дублирования всего репозитория. Отдельный working directory и branch state означают, что один чат может менять свои файлы, пока другой работает над своими, и их правки не наступают друг на друга. Это дешевле и надёжнее, чем несколько полных копий репозитория, и безопаснее, чем два агента в одном дереве. Но за изоляцию нужно платить вниманием к тому, что именно попадает в новый worktree, а что нет.
Ключевая тонкость - в том, какие файлы появляются в worktree сами. Отслеживаемые git файлы присутствуют автоматически: это чистый checkout под контролем версий. А вот gitignored-зависимости, сгенерированные файлы и локальный config сами собой не появляются. Поэтому dev-окружение в новом worktree обычно нужно инициализировать заново - установить зависимости, выполнить setup, - а не рассчитывать, что оно волшебным образом перенесётся из основной рабочей папки.
Для нужных gitignored-файлов есть управляемый механизм переноса. Desktop-приложение может применить настройку локального окружения или скопировать специально перечисленные игнорируемые файлы через .worktreeinclude. Важно, что переносят только то, что действительно перечислено, - это не автоматическое зеркалирование всего игнорируемого, а явный, проверяемый список. Такой контроль и есть смысл механизма: вы решаете, что попадёт в изолированное дерево, а не полагаетесь на случай.
Полезно один раз увидеть, как выглядит осмысленный .worktreeinclude. Ниже - пример: только необходимые одноразовые локальные файлы, например пример локального env или файл с версией toolchain в кэше. К этой форме возвращаются, заводя параллельную работу: список держат коротким и осознанным. Правило простое - переносят disposable-файлы, нужные для запуска, а не всё подряд из основной папки, состояние которой может быть неясным.
Два запрета вокруг .worktreeinclude важнее всего остального. Не включайте секреты: перенос .env со всеми ключами во все worktrees размножает секрет по копиям репозитория. И не включайте огромные каталоги зависимостей: копировать node_modules или аналог через include - это медленно и хрупко. Лучше описать детерминированный setup-скрипт, который восстановит окружение из чистого состояния, чем копировать неясное состояние основной рабочей папки, о котором вы не знаете точно, что в нём.
# .worktreeinclude - только необходимые disposable local files
.env.example.local
.cache/toolchain-version
# НЕ включайте secrets и огромные dependency directories;
# лучше описать deterministic setup script, чем копировать неясное состояниеИнженерный вывод про параллельность прост: изоляция оправдана там, где работа реально независима. Managed worktree даёт эту изоляцию дёшево, но сам по себе он не делает две зависимые задачи независимыми. Если два чата всё равно меняют один контракт, отдельные деревья лишь отложат конфликт до слияния. Параллелят независимые области, а слияние выполняет человек или отдельная интеграционная задача после тестов - ровно как и с любой другой параллельной работой.
Типичные провалы вокруг git и worktrees предсказуемы. Ждать, что gitignored-зависимости и local config перенесутся в worktree сами. Скопировать секреты или гигантские dependency-каталоги через .worktreeinclude вместо setup-скрипта. Понадеяться на checkpoint как на замену коммита. И развести по деревьям задачи, которые всё равно зависят друг от друга. Держите git настоящей историей, переносите в worktree только нужное и явное, а параллельте лишь то, что действительно параллелится.