Git worktree: несколько веток одновременно без stash и второго клона

· 2 мин · BadRabbit

В llm-wiki каждое предложение правки живёт в своём Git worktree. Сегодня разберу, что это за механизм, по туториалу DataCamp.

Проблема

Ты посреди рефакторинга, и тут прилетает срочный баг в продакшене. Варианты так себе:

  • git stash, переключиться, починить, вернуться, git stash pop и надеяться, что ничего не перепутал;
  • закоммитить недоделанное с сообщением «wip»;
  • клонировать репозиторий второй раз, и тогда два набора объектов, два fetch, рассинхрон.

Решение

Worktree — дополнительная рабочая папка, привязанная к тому же репозиторию. У каждой своя ветка, свой индекс и свои файлы, но история, объекты и remotes общие.

git worktree add ../hotfix main            # существующая ветка в новой папке
git worktree add -b feature-x ../feature-x # новая ветка + папка разом
git worktree list                          # что где открыто
git worktree remove ../hotfix              # аккуратно убрать
git worktree prune                         # подчистить, если папку удалили руками

Как это устроено

В основной папке лежит настоящий .git. А в дополнительной .git — это файл из одной строки, который указывает на служебную папку внутри основного репозитория (.git/worktrees/<имя>). Коммит, сделанный в любом worktree, сразу появляется в общей базе.

Подводные камни

  • Одну ветку нельзя открыть в двух worktree одновременно. Git защищает от конфликтующих коммитов.
  • Место на диске: каждый worktree — полная копия файлов (но не истории). Если их накопилось двадцать, это заметно.
  • Не вкладывать worktree друг в друга: потом сложно разобраться и убрать.

Агенты

Самый свежий сценарий из статьи — параллельные ИИ-агенты. Каждому агенту свой worktree, и они не мешают друг другу: один чинит тесты, другой пишет документацию, третий делает ревью. Цена — токены и время на настройку окружения в каждой папке.

Мой комментарий

В llm-wiki worktree решает задачу изоляции предложений. Агент или человек готовит правку правила в своём worktree на отдельной ветке. Основная вики не меняется, пока ревьюер не примет предложение, и тогда изменения сливаются атомарно. Отклонили — worktree просто удаляется.

Самым трудным оказался крайний случай: что делать, если worktree предложения потерялся или сломался, например из-за краша посреди записи. В последних коммитах wikisvc научился запускаться и в такой ситуации, а не падать при старте.