Ты хочешь, чтобы одна сессия Claude поправила документацию, а другая в это же время дописала тест. Если запустить обе в одной папке, они будут править одни и те же файлы и мешать друг другу. Нужна вторая рабочая папка.
Что такое worktree
— это ещё одна рабочая папка того же репозитория на своей . История у папок общая, а файлы у каждой свои.
claude --worktree docs-pass
Claude Code создаёт папку .claude/worktrees/docs-pass/ на новой ветке worktree-docs-pass и запускает сессию в ней. Короткая форма — claude -w docs-pass. Инструменты правки такой сессии не трогают твою основную папку, а её команды не запускаются там и не направляют туда git.
Одно условие: в этом репозитории ты уже хотя бы раз запускал claude и принял вопрос о доверии папке. Иначе claude --worktree завершится с ошибкой.
Что общее, а что нет
| Общее для всех worktree | У каждого worktree своё |
|---|---|
| коммиты | незакоммиченные правки |
| ветки | установленные зависимости (node_modules) |
| история | игнорируемые git файлы, например .env |
Каждый worktree — это свежая выгрузка из git. Поэтому сессии во втором worktree первым делом придётся поставить зависимости.
Подготовка проекта
1. Исключи папку worktree из git. Иначе их содержимое появится в основной папке как неотслеживаемые файлы:
echo '.claude/worktrees/' >> .gitignore
git add .gitignore && git commit -m "Ignore Claude Code worktrees"
git push
Исключай именно .claude/worktrees/, а не весь .claude/: там лежат настройки и навыки, которые ты коммитишь для команды.
2. Нужные игнорируемые файлы — в .worktreeinclude. Если проекту для запуска нужен .env, перечисли его в файле .worktreeinclude в корне репозитория, и он скопируется в каждый новый worktree:
echo '.env' > .worktreeinclude
Пиши туда только необходимое: каждый worktree получает собственную копию каждого секрета.
От какой ветки стартует worktree
Новый worktree ответвляется от основной ветки на удалённом репозитории, а не от твоего локального HEAD. Незапушенные коммиты и работа из твоей фичевой ветки в него не попадут. Вот зачем на шаге 1 был git push.
Если нужно стартовать от локального 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 или удалить. После слияния выбирай удаление.
Мини-проверка
Сессия в worktree не видит последний коммит, который ты сделал час назад. Почему?
Осторожно
Удаление worktree стирает его папку и ветку вместе со всем, что ты не слил. Сначала git merge, потом удаление — или выбери «оставить». И помни: «Да, и больше не спрашивать» для команды оболочки в сессии worktree обычно сохраняется в .claude/settings.local.json основной папки и действует во всём репозитории даже после удаления worktree. Несколько сессий сразу ещё и умножают расход токенов: давай каждой одну небольшую задачу.
Практика в терминале