# Параллельные сессии в worktree

Курс: Claude Code: уровень профи — https://zero2claude.ru/learn/claude-code-pro
Канонический URL: https://zero2claude.ru/learn/claude-code-pro/4-1-worktree-parallelnye-sessii

claude --worktree запускает сессию в отдельной рабочей папке на своей ветке. Две сессии правят каждая свою копию файлов, а работа возвращается через git merge из основной папки. Подготовь .gitignore, помни про .worktreeinclude и про то, от какой ветки стартует worktree.

Ты хочешь, чтобы одна сессия Claude поправила документацию, а другая в это же время дописала тест. Если запустить обе в одной папке, они будут править одни и те же файлы и мешать друг другу. Нужна вторая рабочая папка.

## Что такое worktree

Worktree — это ещё одна рабочая папка того же репозитория на своей ветке. История у папок общая, а файлы у каждой свои.

```bash
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.** Иначе их содержимое появится в основной папке как неотслеживаемые файлы:

```bash
echo '.claude/worktrees/' >> .gitignore
git add .gitignore && git commit -m "Ignore Claude Code worktrees"
git push
```

Исключай именно `.claude/worktrees/`, а не весь `.claude/`: там лежат настройки и навыки, которые ты коммитишь для команды.

**2. Нужные игнорируемые файлы — в `.worktreeinclude`.** Если проекту для запуска нужен `.env`, перечисли его в файле `.worktreeinclude` в корне репозитория, и он скопируется в каждый новый worktree:

```bash
echo '.env' > .worktreeinclude
```

Пиши туда только необходимое: каждый worktree получает собственную копию каждого секрета.

## От какой ветки стартует worktree

Новый worktree ответвляется **от основной ветки на удалённом репозитории**, а не от твоего локального HEAD. Незапушенные коммиты и работа из твоей фичевой ветки в него не попадут. Вот зачем на шаге 1 был `git push`.

Если нужно стартовать от локального HEAD, добавь в `.claude/settings.local.json`:

```json
{ "worktree": { "baseRef": "head" } }
```

Без удалённого репозитория worktree и так стартует от локального HEAD.

## Как вернуть работу

Каждая сессия коммитит на своей ветке. Сливаешь ты — **из основной папки**, в отдельном терминале:

```bash
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 стирает его папку и ветку вместе со всем, что ты не слил. Сначала git merge, потом удаление — или выбери «оставить». И помни: «Да, и больше не спрашивать» для команды оболочки в сессии worktree обычно сохраняется в .claude/settings.local.json основной папки и действует во всём репозитории даже после удаления worktree. Несколько сессий сразу ещё и умножают расход токенов: давай каждой одну небольшую задачу.
