Урок 03 · Одно понятие

Worktrees: несколько папок, одна история

Ветки развели историю. Осталось развести папки — и тогда два агента будут работать не по очереди, а одновременно.

~15 минутнужен урок 2вводить в терминал ничего не надо

Зачем это в твоей миссии

Это тот самый урок, ради которого затевался курс. Параллельная работа агентов упирается не в Git и не в модель — она упирается в одну простую физическую вещь. Worktree её и снимает.

Начнём с ситуации

Тот же магазин, что и в прошлом уроке. Ты уже умеешь заводить ветки, и в прошлый раз агенты работали по очереди: ты переключал папку то на одну ветку, то на другую, и передавал её от одного к другому.

Теперь хочется по-настоящему одновременно: пока первый агент два дня пишет оплату, второй за двадцать минут чинит корзину. И тут ты упираешься в стену, у которой нет никакого отношения к Git.

Пройди историю по шагам. Смотри на нижнюю часть — там теперь может быть больше одной папки.

Теперь определение

После этого официальная формулировка читается спокойно. Документация Git говорит так: «репозиторий может обслуживать несколько рабочих деревьев, позволяя держать развёрнутыми больше одной ветки одновременно».

СловоЧто это значит в нашей истории
рабочее деревоПапка с файлами проекта в развёрнутом виде. Та самая, которую ты видишь в Finder и открываешь в редакторе.
несколькоПапок может быть сколько угодно. Репозиторий при этом остаётся один — история общая на всех.
больше одной ветки одновременноВот она, вся суть. Одна папка показывает одну ветку. Нужны две ветки развёрнутыми разом — нужны две папки.

Заметь, чего в определении нет: слова «копия». Проект не копируется, репозиторий не дублируется. Появляется ещё одно окно в ту же самую историю.

Что при этом реально появляется на диске

Стоит посмотреть, потому что это снимает почти все страхи разом:

проект/                     ← рабочее дерево №1
    .git/                   ← вся история проекта, одна на всех

worktrees/оплата/           ← рабочее дерево №2
    .git                    ← файл на 105 байт, а не папка

В новой папке .git — это не хранилище, а текстовый файл в одну строку:

gitdir: /путь/к/проекту/.git/worktrees/оплата

Буквально записка: «история не здесь, история вон там». Отсюда и вес. На реальном проекте это выглядит так: сам проект — 65 МБ, новое рабочее дерево — 168 КБ. В четыреста раз меньше, потому что в дерево разворачиваются только те файлы, которые попадают в снимки. Всё тяжёлое — зависимости, сборки, кэши — Git не хранит, а значит, и разворачивать ему нечего.

Встроенная защита от дурака

Одну и ту же ветку нельзя развернуть в двух деревьях сразу — Git просто откажется. Поэтому два агента физически не могут случайно оказаться на одной ветке и затоптать работу друг друга. Они всегда на разных.

Когда worktree не нужен

Об этом редко говорят, а зря. Worktree — не обязательный ритуал, а решение конкретной проблемы. Если ты работаешь один и последовательно, обычного переключения веток хватает с запасом: закоммитил недоделанное, ушёл на main, починил, вернулся — работа ждала тебя на месте.

Формула короткая:

Переключение веток — для работы по очереди. Worktrees — для работы одновременно.

Поэтому отдельная папка ради правки на две минуты — лишняя возня. А вот второй агент — это уже одновременность, и тут без неё никак.

Одна засада, о которой узнают опытным путём

Свежее рабочее дерево — это чистая развёртка снимка. А в снимке, как мы разбирали, лежат только отслеживаемые файлы. Значит, в новой папке не будет ни зависимостей, ни .env: ни того, что весит гигабайты и восстанавливается по рецепту, ни того, что намеренно держат подальше от снимков.

Выглядит это как «агент зашёл в новую папку, и ничего не работает». Лечится один раз и навсегда:

Если проект на pnpm, дублирования почти нет

pnpm держит один общий склад пакетов и собирает node_modules из жёстких ссылок на него. Уже скачанный файл в новом дереве не копируется — он получает второе имя. Десять деревьев с одинаковыми зависимостями занимают на диске столько же, сколько одно, а установка проходит за секунды.

Условие одно, прямо из документации pnpm: склад должен лежать на том же диске, что и проекты. Иначе пакеты будут копироваться, а не связываться.

Подробнее про это — в отдельном уроке npm и pnpm: как зависимости попадают на диск, с замерами.

Как это включить у себя

Хорошая новость: в двух из трёх мест говорить ничего не надо.

Claude Desktop

Ничего делать не нужно. По документации, каждая новая сессия автоматически получает свой worktree. Два агента параллельно — это просто две сессии.

Claude Code в терминале

Запуск с именем: claude -w оплата. Папка, ветка и агент внутри — всё создаётся разом. Второй терминал с другим именем — второй агент.

Paseo

Настройка при создании воркспейса: изоляция worktree вместо local. Отвести можно от основной ветки, от существующей или сразу из чужого PR.

А если ты уже в разговоре с агентом и понял, что задача разрослась, — работает и просто словами. Claude Code умеет перейти в отдельное дерево по ходу дела, сам.

Как сказать агенту

Задача разрослась посреди разговора

Давай эту задачу делать в отдельном worktree. Заведи ветку feature/pay, перейди туда и продолжай работу там.

Говори «worktree» латиницей. Русское «дерево» агент поймёт как структуру каталогов и покажет тебе дерево папок.

Ставишь задачу второму агенту

Работай в своём worktree на ветке fix/cart. В основную папку не заходи — там сейчас другая работа.

Вторая фраза важнее первой. Она задаёт границу явно, а не надеется, что агент догадается сам.

Хочешь посмотреть чужую работу

Разверни ветку feature/pay в отдельном worktree и покажи, что там изменилось. Мою текущую работу не трогай.

История общая, поэтому чужой коммит виден сразу и никуда его тянуть не надо. Позже так же будешь смотреть работу подрядчиков.

Чего просить не стоит

Формулировка «сделай копию проекта в другой папке» звучит похоже, но агент может понять её буквально и скопировать папку целиком. Получатся два независимых проекта с разными историями — ровно то, чего worktree позволяет избежать. Слово worktree такой двусмысленности не оставляет.

Проверь себя

Первоисточники к этому уроку

Официальная справка git-worktree — на английском, зато первоисточник. Первый абзац ровно про то, что разобрано выше.

Claude Code → Run parallel sessions with worktrees — там же про .worktreeinclude и про автоматические деревья в десктопе. Paseo → Git worktrees — как это устроено в воркспейсах Paseo.

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