✻ Claude Code по-русски
🎧 Аудиокурс
🎧 Слушать урок13:22 · голос Russian_BrightHeroine

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

Продвинутый уровень · Урок 1 из 7 · около 20 минут · Нужно: Оглавление Продвинутого уровня · Сверено с Claude Code v2.1.285 (stable) 09.10.2026

#Цель

К концу урока вы сможете запустить две сессии Claude Code одновременно, каждую в собственном git worktree, и слить их работу в одну ветку.

#Что понадобится

#Идея

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.

#Разбор примера

  1. В основном 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).

Критерии приёмки:

git worktree list --porcelain > .practice/a-1-worktrees.txt

#Проверка

Урок пройден, когда выполнено всё это:

Запустите 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).

#Осторожно

#Что дальше


Источники: 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

← Оглавление Продвинутого уровня · Выбор паттерна оркестрации → · Тема: Субагенты и параллельная работа · Застряли на уроке?