Git worktree: несколько веток одновременно без stash и второго клона
В 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 научился запускаться и в такой ситуации, а не падать при старте.