раздел 09 · подстраница 1
Git worktrees
Worktree - это встроенная фича git, которая позволяет иметь несколько рабочих копий одного репозитория в разных папках. Каждая копия на своей ветке, история коммитов общая. Это база для параллельной работы Claude.
Концепция
Обычно репозиторий - это одна папка, в которой переключение между ветками меняет файлы на диске. С worktree вы создаёте отдельные папки, и каждая папка - своя ветка. Переключение между ветками = переключение между папками.
~/app/ # основной репо, ветка main
~/app-feat-auth/ # worktree, ветка feat-auth
~/app-fix-bug/ # worktree, ветка fix-bug
Все три указывают на один и тот же .git, но на разные ветки. Все три можно держать открытыми одновременно - в IDE, в Claude, где угодно.
Зачем для параллельных Claude
Один Claude умеет много, но он один. Если запустить три Claude параллельно в одной папке - они начнут конфликтовать: один правит файл, второй его читает в полусыром состоянии, третий пытается коммитить в ту же ветку. Хаос.
С worktree каждый Claude получает свою папку и свою ветку. Изоляция полная. В конце мержим всё в main.
Команды
Создать worktree
# Создать новую ветку и worktree под неё
git worktree add ../app-feat-a feat-a
# Worktree на существующей ветке
git worktree add ../app-hotfix hotfix-1.2
# Worktree без создания новой ветки (detached)
git worktree add ../app-experiment HEAD
Папка ../app-feat-a появится рядом с основной. Имя папки - на ваше усмотрение, я предпочитаю префикс <repo>-<branch>.
Список worktree
git worktree list
# /Users/me/app a1b2c3d [main]
# /Users/me/app-feat-a d4e5f6a [feat-a]
# /Users/me/app-feat-b g7h8i9b [feat-b]
Удалить worktree
git worktree remove ../app-feat-a
# или если папка уже удалена руками
git worktree prune
После remove ветка остаётся в git, удаляется только рабочая копия. Чтобы и ветку убрать:
git branch -d feat-a
Структура файловой системы при 3+ worktree
Я держу worktree рядом с основной папкой, не внутри:
~/Cursor/
├── app/ # main worktree (основной)
├── app-feat-auth/ # worktree #1
├── app-feat-payments/ # worktree #2
└── app-refactor/ # worktree #3
Не внутри app/ - иначе git будет ругаться и IDE начнёт индексировать дочерние папки как часть основной.
Когда worktree становится не нужен:
cd ~/Cursor/app # вернуться в основной
git worktree remove ../app-feat-auth
git branch -d feat-auth # если ветка уже замержена
Типичный workflow с Claude
# 1. Создать ветку и worktree
cd ~/app
git worktree add ../app-feat-x feat-x
# 2. Запустить Claude в новой папке
cd ../app-feat-x
claude
# 3. Поработать, закоммитить
# (внутри Claude или руками)
git add -A && git commit -m "feat: implement X"
# 4. Запушить
git push -u origin feat-x
# 5. Создать PR, замержить (через gh или GitHub UI)
gh pr create --fill
# 6. Убрать worktree после мержа
cd ~/app
git worktree remove ../app-feat-x
Что синхронизируется между worktree
.git/- один общий, история коммитов видна всем- Ветки и теги - общие
git stash- общий- Конфиги - общие (
.git/config)
Что НЕ синхронизируется:
- Файлы в рабочей копии - у каждого worktree свои
node_modules- у каждого свой, нужно ставить отдельно.env- у каждого свой (или симлинк на общий).next/,dist/, прочие билды - у каждого свои
Антипаттерны
- Создавать worktree внутри основной папки. Будет хаос с индексацией.
- Забывать удалять старые worktree. Через месяц у вас 15 папок и непонятно зачем они.
- Запускать
npm installв каждом worktree подряд - быстро забьётся диск. Если зависимости одинаковые, можно симлинкатьnode_modules(но это хрупко - лучше pnpm с глобальным store). - Держать
.envруками в каждом worktree - забудете обновить. Лучше симлинк.
Полезные ссылки
- git worktree - официальная дока
- Atlassian: worktree tutorial - подробный гайд
- Следующая страница: Тим-лид паттерн - как один Claude дирижирует несколькими