Рано или поздно у тебя появляются две задачи, которые не зависят друг от друга: поправить README и дописать тест к старой функции. Каждая займёт у Claude минут десять. Ждать, пока закончится первая, обидно, а запускать две сессии в одной папке опасно: они будут читать и править одни и те же файлы, и в какой-то момент одна перезапишет то, что только что сделала другая.
Решение давно есть в самом git, а Claude Code сделал его удобным. Это worktree — вторая рабочая папка того же репозитория. В этом посте разберём, как она работает в Claude Code и где на ней обычно спотыкаются.
Что такое worktree простыми словами
Представь репозиторий как книгу с общей историей правок. Обычно у тебя один экземпляр, раскрытый на одной ветке. Worktree — это второй экземпляр той же книги, раскрытый на другой ветке. Пишешь в нём что хочешь, а первый экземпляр остаётся нетронутым. История у обоих общая, поэтому потом правки легко свести.
В Claude Code для этого одна команда:
claude --worktree docs-pass
Claude Code создаст папку .claude/worktrees/docs-pass/, заведёт в ней новую ветку worktree-docs-pass и запустит сессию прямо там. Короткая форма — claude -w docs-pass. Вторую задачу запускаешь в соседнем окне терминала с другим именем, например claude -w test-pass.
Сессия в worktree правит только свою копию файлов. Её команды не запускаются в твоей основной папке и не направляют туда git.
Одно условие: в этом репозитории ты уже хотя бы раз запускал обычный claude и ответил на вопрос о доверии папке. Без этого claude --worktree завершится с ошибкой.
Что у папок общее, а что у каждой своё
Это главное, что нужно держать в голове:
| Общее для всех worktree | У каждой папки своё |
|---|---|
| коммиты | незакоммиченные правки |
| ветки | установленные зависимости, например node_modules |
| история | файлы, которые git игнорирует, например .env |
Отсюда два практических следствия. Во-первых, каждый worktree — свежая выгрузка из git, и сессии придётся заново поставить зависимости проекта. Во-вторых, всего, что лежит в .gitignore, в новой папке просто не будет. Если проект без .env не запускается, сессия в worktree упрётся в это с первой же команды.
Подготовка: три шага до первого запуска
Шаг 1. Спрячь папку worktree от git. Иначе их содержимое вылезет в основной папке как куча неотслеживаемых файлов:
echo '.claude/worktrees/' >> .gitignore
git add .gitignore && git commit -m "Ignore Claude Code worktrees"
git push
Исключай именно .claude/worktrees/, а не весь .claude/. В .claude/ лежат настройки и навыки, которые ты коммитишь для всей команды, — их прятать не нужно.
Шаг 2. Перечисли нужные игнорируемые файлы в .worktreeinclude. Этот файл в корне репозитория говорит Claude Code, что скопировать в каждую новую папку:
echo '.env' > .worktreeinclude
Не превращай его в свалку. Каждый worktree получает собственную копию каждого перечисленного файла, а значит, и каждого секрета. Пиши туда только то, без чего проект не стартует.
Шаг 3. Запушь. Зачем — в следующем разделе, это самая частая ловушка.
Ловушка: worktree не видит твой свежий коммит
Ты закоммитил правку час назад, запустил claude -w, а сессия её не видит. Ничего не сломалось: новый worktree по умолчанию ответвляется от основной ветки на удалённом репозитории, а не от твоего локального HEAD. Незапушенные коммиты и всё, что есть только в твоей фичевой ветке, в него не попадают.
Два выхода:
- запушить нужные коммиты до запуска worktree;
- попросить стартовать от локального HEAD — добавить в
.claude/settings.local.json:
{ "worktree": { "baseRef": "head" } }
Если удалённого репозитория у проекта нет вовсе, worktree и так стартует от локального HEAD.
Как вернуть работу обратно
Каждая сессия коммитит на своей ветке. Сливать будешь ты сам, из основной папки, в отдельном терминале:
git worktree list
git merge worktree-docs-pass
git merge worktree-test-pass
Почему не попросить об этом саму сессию? Пока она изолирована в worktree, Claude Code блокирует её git-команды, которые лезут в основную папку. Это не баг, а та самая изоляция, ради которой всё затевалось.
Если обе задачи поменяли одни и те же строки, git остановится на конфликте. Разреши его руками или запусти обычный claude в основной папке и попроси помочь.
Когда всё слито, набери /exit в каждой сессии. Если на ветке worktree есть новые коммиты, Claude Code спросит, оставить папку или удалить. После слияния смело удаляй.
Три вещи, о которых жалеют
Удаление worktree стирает его папку и ветку вместе со всем, что ты не слил, поэтому сначала git merge, потом удаление. Ответ «Да, и больше не спрашивать» на команду оболочки в сессии worktree обычно сохраняется в .claude/settings.local.json основной папки и действует во всём репозитории даже после удаления worktree — одобряй так только то, что разрешил бы везде. И каждая параллельная сессия расходует свои токены: давай каждой одну небольшую задачу.
Когда worktree не нужен
Параллельность нужна не всегда. Если задачи зависят друг от друга, например тест проверяет код, который вторая сессия ещё пишет, проще сделать их по очереди в одной сессии. А если тебе нужно просто разгрузить контекст, например изучить три папки и получить короткие сводки, хватит субагентов: им не нужна отдельная рабочая папка. Как выбирать между субагентами, workflow и командой агентов, разбираем в уроке «Какую схему выбрать».
Worktree хорош, когда две задачи правят файлы, не зависят друг от друга и каждая заканчивается коммитом.
Частые вопросы
Чем claude --worktree отличается от обычного git checkout другой ветки?
Checkout переключает твою единственную папку на другую ветку, и обе задачи всё равно делят один набор файлов. Worktree создаёт вторую папку на своей ветке, поэтому две сессии работают одновременно и не трогают файлы друг друга.
Где лежит папка worktree и как называется ветка?
Папка — .claude/worktrees/<имя>/ внутри репозитория, ветка — worktree-<имя>. Например, для claude -w docs-pass это .claude/worktrees/docs-pass/ и worktree-docs-pass.
Почему в новом worktree нет файла .env?
Каждый worktree — свежая выгрузка из git, а .env git игнорирует. Перечисли его в файле .worktreeinclude в корне репозитория, и он будет копироваться в каждый новый worktree.
Может ли сессия в worktree сама слить свою ветку в основную?
Нет. Пока сессия изолирована в worktree, Claude Code блокирует её git-команды, которые затрагивают основную папку. Сливаешь ты сам из основной папки через git merge.
Попробуй руками
В уроке «Параллельные сессии в worktree» курса «Claude Code: уровень профи» всё это отрабатывается в тренажёре прямо в браузере: подготовить .gitignore, создать .worktreeinclude и запустить первую сессию в worktree. Курс бесплатный, а короткая выжимка команд всегда под рукой в шпаргалке по Claude Code.