#Параллельные сессии в worktree
Продвинутый уровень · Урок 1 из 7 · около 20 минут · Нужно: Оглавление Продвинутого уровня · Сверено с Claude Code v2.1.285 (stable) 09.10.2026
#Цель
К концу урока вы сможете запустить две сессии Claude Code одновременно, каждую в собственном git worktree, и слить их работу в одну ветку.
#Что понадобится
- Один из ваших репозиториев с командой запуска тестов и без незакоммиченных изменений, на ветке по умолчанию и синхронизированный с удалённым репозиторием, в который вы можете пушить (почему — сказано в разделе «Осторожно»), а также ваша копия шаблона для практики с Node.js LTS и проверками Продвинутого уровня (Практика): проверка запускается из копии. Подготовьте в репозитории папку
.practice/, как описано в уроке 1 Начального уровня, если ещё не сделали этого. - Если вы ещё не запускали
claudeв этом репозитории, запустите его там один раз и примите диалог доверия: до этогоclaude --worktreeзавершается с ошибкой (Start Claude in a worktree). - macOS, Linux или WSL 2 и три терминала, открытых в корне репозитория: два для сессий, один для git.
- Расход лимита: умеренный. Две сессии работают одновременно.
#Идея
Git worktree — это вторая рабочая папка на собственной ветке, разделяющая историю репозитория. claude --worktree <name> (или -w <name>) создаёт её в .claude/worktrees/<name>/ на новой ветке worktree-<name> и запускает в ней сессию (Start Claude in a worktree). Каждая сессия правит свою копию файлов. Кроме того, Claude Code не даёт инструментам редактирования файлов в сессии worktree менять ваш основной checkout, а её командам — запускаться там или направлять туда git (How Claude Code enforces isolation).
Коммиты и ветки общие. Незакоммиченные правки, установленные зависимости и файлы из .gitignore вроде .env — нет: каждый worktree — это свежий checkout. Файл .worktreeinclude в корне репозитория копирует перечисленные в нём игнорируемые файлы в каждый новый worktree (Copy gitignored files into worktrees); перечисляйте только то, что нужно проекту, ведь каждый worktree получает собственную копию каждого секрета.
Работа возвращается через git: каждая сессия коммитит в свою ветку, вы сливаете ветки из основного checkout, а затем удаляете worktree.
#Разбор примера
- В основном checkout добавьте в игнор папку, где живут worktree, затем закоммитьте и запушьте правило. Без него содержимое worktree отображается в основном checkout как неотслеживаемые файлы. Push отправляет правило в ветку по умолчанию удалённого репозитория, от которой начинаются новые worktree (подробнее — в разделе «Осторожно»):
printf '\n.claude/worktrees/\n' >> .gitignore
git add .gitignore && git commit -m "Ignore Claude Code worktrees"
git push
Начальный \n ставит правило на отдельную строку, даже если ваш .gitignore не заканчивается переводом строки. После этого git status --short ничего не выводит, а git log -1 --oneline показывает коммит.
2. В терминале 1 запустите сессию в новом worktree и дайте ей задачу по документации:
claude --worktree docs-pass
Tidy the wording of the README's first section, then wait for me before you commit.
Claude Code создаёт .claude/worktrees/docs-pass/ на ветке worktree-docs-pass, и сессия работает там. Одобрите правку, когда она спросит. Просьба подождать удерживает коммит до шага 4 даже там, где запроса разрешения не было бы: сессия worktree использует .claude/settings.local.json вашего основного checkout (Settings files and precedence), поэтому, если там включён режим auto-allow песочницы из урока 4 Среднего уровня, команды в песочнице вроде git commit выполняются без вопросов (Sandbox modes).
3. В терминале 2 запустите вторую сессию с коротким флагом и дайте ей задачу по тестам:
claude -w test-pass
This worktree is a fresh checkout: install the dependencies, then add one missing test for a small exported function and run the tests. Wait for me before you commit.
Claude Code создаёт .claude/worktrees/test-pass/ на ветке worktree-test-pass; сессия устанавливает там зависимости, прежде чем добавить тест. Одобряйте её шаги так же.
4. В терминале 3, в основном checkout, посмотрите на все три рабочие копии, пока обе сессии ждут вас:
git worktree list
git status --short
git -C .claude/worktrees/docs-pass status --short
git -C .claude/worktrees/test-pass status --short
git worktree list показывает сначала основной checkout, затем .claude/worktrees/docs-pass на [worktree-docs-pass] и .claude/worktrees/test-pass на [worktree-test-pass]; пока сессия работает, git может пометить её worktree как locked. git status --short не показывает правок ни одной из сессий: они происходят в других папках. Каждая команда git -C показывает только изменения сессии в своей папке — например README в docs-pass — и никогда не показывает изменения другой. Теперь скажите каждой сессии закоммитить: git log --oneline --graph --all покажет по новому коммиту на каждой ветке.
5. Всё ещё в основном checkout слейте обе ветки, затем запустите тесты:
git merge worktree-docs-pass
git merge worktree-test-pass
git merge переносит коммиты каждой ветки в вашу. Первое слияние просто сдвигает вашу ветку вперёд (fast-forward): worktree-docs-pass началась с коммита, который вы запушили на шаге 1, так что в вашей ветке нет коммитов, которых нет в ней. Второе создаёт merge-коммит, потому что в вашей ветке теперь есть коммит, которого нет в worktree-test-pass, и открывает редактор для сообщения: сохраните и закройте его. Выполните этот шаг сами: пока сессия изолирована в своём worktree, Claude Code блокирует её git-команды, которые лезут в основной checkout. Если обе задачи изменили одни и те же строки, git остановится с конфликтом: разрешите его сами или запустите claude в основном checkout и попросите сделать это.
6. В каждой сессии выполните /exit. В ветке worktree есть новый коммит, поэтому Claude Code спросит, оставить worktree или удалить: выберите удаление (Clean up worktrees). git worktree list больше не показывает ни один из них.
Осторожно
Удаление worktree стирает его папку и ветку вместе со всей несслитой работой в них. Сначала слейте ветку или выберите «оставить».
#Ваша очередь
Выберите в своём репозитории два небольших изменения, затрагивающих разные файлы, — например исправление в одном модуле и недостающий тест для другого. Сделайте каждое в отдельной сессии worktree, запустив обе сессии одновременно, и перенесите оба изменения в свою ветку.
Если работы, на которую они должны опираться, ещё нет в ветке по умолчанию удалённого репозитория (см. «Осторожно»), сначала отправьте её туда или добавьте "worktree": {"baseRef": "head"} в .claude/settings.local.json — ваш личный файл настроек из урока 4 Среднего уровня, — чтобы новые worktree начинались с вашего локального HEAD (worktree.baseRef).
Критерии приёмки:
- Закоммиченный
.gitignoreигнорирует.claude/worktrees/и не игнорирует остальное содержимое.claude/. - Каждое изменение сделано в своей сессии, запущенной через
claude --worktree <name>, и закоммичено в ветку этого worktree. .practice/a-1-worktrees.txtсодержит выводgit worktree list --porcelain, сохранённый из основного checkout, пока оба worktree существовали и в обоих уже были коммиты:
git worktree list --porcelain > .practice/a-1-worktrees.txt
- Обе ветки слиты в вашу через
git merge, а неgit merge --squash. - После обоих слияний тесты проходят (не проверяется).
- Оба worktree удалены, а любая оставленная ветка удалена только после слияния.
- Необязательно, не проверяется: если проекту для запуска нужен игнорируемый файл, например локальный конфиг, перечислите его в файле
.worktreeincludeв корне репозитория.
#Проверка
Урок пройден, когда выполнено всё это:
- Закоммиченный
.gitignoreигнорирует.claude/worktrees/, но не остальное содержимое.claude/. -
.practice/a-1-worktrees.txtперечисляет два worktree в.claude/worktrees/, чьи коммиты разошлись друг с другом, и оба слиты в вашу ветку. - Ни одного из этих worktree больше нет:
git worktree listих не показывает. - Самопроверка (не тестируется): пока обе сессии работали, ни одна не видела незакоммиченных правок другой.
Запустите npm run check -- a-1 --dir <your repo> из своей копии для практики.
Если не проходит первый пункт, выполните в репозитории git -c core.excludesFile=/dev/null check-ignore -v .claude/worktrees/x (часть -c подменяет ваш глобальный файл исключений core.excludesFile пустым, как это делает проверка): команда должна назвать ваш .gitignore и совпавшую строку (git-check-ignore). Правило, которое есть только в .git/info/exclude или в глобальном файле исключений, не закоммичено, а широкое правило вроде .claude/ спрятало бы и настройки со скиллами, которые вы коммитите для команды. Если не проходит второй пункт, прочитайте подсказку, которую выводит проверка: сохраните файл после того, как обе сессии закоммитили, и до удаления любого из worktree, и слейте каждую ветку через git merge. Если не проходит третий пункт, выполните из основного checkout git worktree remove <path> для каждого пути, который называет проверка, предварительно выполнив git worktree unlock <path>, если git говорит, что worktree заблокирован. Ветка worktree при этом останется: удалите её после слияния командой git merge-base --is-ancestor worktree-<name> HEAD && git branch -D worktree-<name>. Первая команда успешна, только если ветка входит в HEAD (git-merge-base), а -D удаляет ветку без собственной проверки git на слитость, которая сверяет ветку с её upstream, если он есть, а не с HEAD (git-branch).
#Осторожно
- В большинстве репозиториев в macOS, Linux и WSL 2 ответ «Yes, and don't ask again» на Bash-команду в сессии worktree сохраняет правило в
.claude/settings.local.jsonвашего основного checkout. После этого оно действует и в основном checkout, и во всех worktree репозитория, и остаётся после удаления worktree (What worktrees share with the main checkout). Одобряйте только команды, которые разрешили бы везде. - Несколько одновременных сессий умножают расход токенов (Run agents in parallel). Давайте каждой сессии одну небольшую задачу и закрывайте её, как только её ветка слита.
- Новый worktree ответвляется от ветки по умолчанию удалённого репозитория, а не от вашего локального
HEAD(Choose the base branch). Коммитов, которых ещё нет в той ветке, — незапушенных или из вашей фича-ветки — в нём не будет, а слияние его ветки в ветку, отстающую от ветки по умолчанию удалённого репозитория, принесёт коммиты, которых в ней не хватает. Если удалённого репозитория нет, новый worktree начинается с вашего локальногоHEAD.
#Что дальше
- Isolate subagents with worktrees:
isolation: worktreeво фронтматтере субагента даёт каждому его запуску собственный checkout. - Message your other Claude Code sessions: пусть сессии в ваших worktree передают друг другу находки.
- Run multiple Claude sessions: паттерн «Писатель/Ревьюер», где свежая сессия проверяет то, что написала другая.
Источники: Run parallel sessions with worktrees · All settings · Settings files and precedence · Configure the sandboxed Bash tool · Run agents in parallel · git-worktree · git-merge · git-check-ignore · gitignore · git-merge-base · git-branch
← Оглавление Продвинутого уровня · Выбор паттерна оркестрации → · Тема: Субагенты и параллельная работа · Застряли на уроке?