раздел 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 - забудете обновить. Лучше симлинк.

Полезные ссылки