Что такое Git worktrees и зачем их использовать
Git worktrees сейчас в тренде, хотя в Git они появились ещё в 2015 году. Разбираемся, чем они отличаются от обычных веток, и почему внезапно стали популярны.
Перевод статьи Cassidy Williams из GitHub Blog, оригинал: https://github.blog/ai-and-ml/github-copilot/what-are-git-worktrees-and-why-should-i-use-them/
Git worktrees позволяют держать несколько рабочих копий одного репозитория на разных ветках — и сейчас эта возможность в тренде. Забавно, что в Git она появилась ещё в 2015 году. Но worktrees действительно удобны, и в этой статье разберёмся, зачем они нужны, чем отличаются от обычных веток и почему внезапно стали популярны.
Ключевые выводы
worktree — это дополнительная рабочая копия репозитория на другой ветке, привязанная к тому же .git.
С их помощью можно переключаться между задачами, не прерывая текущую работу и не используя stash.
Они особенно полезны при параллельной работе с ИИ-агентами и в приложении GitHub Copilot.
У worktrees есть ограничения: раздувание зависимостей, необходимость убирать папки, правила .gitignore и запрет на одновременный checkout одной ветки в нескольких worktrees.
Переключение контекста через ветки и stash
Представьте: вы работаете над задачей и вдруг получаете срочный баг. Нужно срочно переключить контекст.
Сначала, скорее всего, спрячете текущие изменения в stash:
Потом перейдёте на main и обновите её:
Затем создадите ветку с хотфиксом:
Пофиксите, закоммитите и запушите ветку:
После слияния pull request вы вернётесь к компьютеру, подтянете main и удалите ветку с багфиксом:
А потом сможете вернуться к задаче, над которой работали:
Фух. На чём мы остановились?
Переключение туда-сюда, перезагрузка файлов, переустановка node_modules в зависимости от того, что изменилось, — всё это отнимает много сил. Нагрузка от смены контекста серьёзная.
Это базовый пример, но иногда разработчики справлялись с таким хаосом сложными командами git stash или даже несколькими клонами одного репозитория (я сама грешила этим).
А потом появились… worktrees!
Переключение контекста через worktrees
С worktrees вы никогда не покидаете свою ветку и не используете stash, а редактор с вашей текущей фичей остаётся нетронутым.
Эта команда мгновенно создаёт соседнюю папку hotfix-workspace, базирует её на main и создаёт новую ветку hotfix-bug.
Теперь можно открыть эту папку в новом окне редактора (или перейти в неё через cd) и чинить баг. Исходное окно редактора остаётся в том же состоянии, в котором вы его оставили.
Pull request сливаете онлайн, как обычно, а после слияния можно просто удалить временную папку.
Гораздо плавнее! Нет риска конфликтов stash, редактор не перезагружается, и вы действительно можете работать параллельно.
Так почему же сейчас?
Долгое время worktrees были относительно неизвестны. Большинство разработчиков никогда о них не слышали, потому что либо Git GUI не поддерживали их (или относились как к второсортной функции), либо все привыкли к знакомой схеме: feature-ветка, работа, PR, merge и повтор.
Сейчас наша работа изменилась. ИИ заставляет нас работать параллельно больше, чем когда-либо в истории разработки ПО. Разработчики запускают множество сессий одновременно, а «культура код-ревью» растёт быстрее, чем «культура написания кода».
Агенты и люди могут делать больше параллельно с помощью worktrees. Это режим по умолчанию в приложении GitHub Copilot и во многих других современных инструментах.
Агенты и люди могут делать больше параллельно с помощью worktrees.
В чём подвох?
Worktrees решают кучу проблем, но есть нюансы, на которые стоит обращать внимание.
- Раздувание зависимостей: каждая папка worktree требует собственную копию зависимостей проекта. Если запускать
npm installилиpip installв нескольких worktrees, диск может быстро закончиться. - Управление папками: нужно удалять папки worktree, чтобы со временем не засорять родительский каталог. Приложение GitHub Copilot часто делает это за вас, но если вы работаете в терминале, придётся следить самостоятельно.
- Требования к глобальному
.gitignore: если создавать worktree внутри основного репозитория, их нужно вручную добавить в.gitignore, чтобы случайно не закоммитить. Можно создавать worktree за пределами основного репозитория (GitHub Copilot делает это по умолчанию), но это стоит учитывать. - Ограничение «одна ветка»: Git не позволяет одновременно checkout’ить одну и ту же ветку в двух разных worktrees, чтобы избежать повреждения данных.
Как использовать git worktrees в приложении GitHub Copilot?
Отличный вопрос! Здорово, что там всё работает «из коробки». Когда вы открываете приложение, на главном экране есть выпадающий список, который спрашивает, где запускать новую сессию. По умолчанию выбран новый worktree.
Когда вы запускаете новую сессию, можно нажать на имя сессии вверху приложения и увидеть (забавное!) сгенерированное имя вашего worktree, а также путь, где он находится, проект, для которого он создан, и сведения о внесённых изменениях.
Проще простого!
Стоит ли использовать worktrees?
Я дам вам самый senior-ответ, который только можно: зависит от ситуации! Вам может быть удобнее работать по-другому. Возможно, вы не так много работаете параллельно и привыкли к ментальной модели веток и stash. Возможно, теперь вы будете использовать только worktrees. А может, захотите и то, и другое!
Мир у ваших ног, и попробовать всё это можно уже сегодня в приложении GitHub Copilot.
Об авторе. Cassidy Williams — старший директор по адвокации разработчиков в GitHub. Она создаёт ПО, консультирует стартапы и учит разработчиков строить лучше. Подписаться на её еженедельную рассылку можно на cassidoo.co/newsletter.
Часто задаваемые вопросы
Что такое git worktree?
Это дополнительная рабочая копия репозитория, привязанная к тому же .git, но на другой ветке. Позволяет работать с несколькими ветками одновременно без stash и переключения контекста.
В чём разница между worktree и обычной веткой?
Ветка — это ссылка на состояние кода внутри одного репозитория, а worktree — отдельная рабочая папка для такой ветки. В одном репозитории может быть несколько worktrees, каждый со своей веткой.
Почему worktrees стали популярны только сейчас?
Раньше их плохо поддерживали GUI-клиенты, да и привычный рабочий процесс с ветками устраивал большинство. С ростом ИИ-агентов и параллельных сессий необходимость работать сразу с несколькими ветками выросла.
Какие у worktrees ограничения?
Каждый worktree требует собственную копию зависимостей, нужно следить за папками и не забывать .gitignore, а одну ветку нельзя checkout’ить в двух worktrees одновременно.
Нужен ли worktree, если я не использую GitHub Copilot?
Да, можно использовать без Copilot: worktree — это встроенная функция Git 2.5+. Она доступна в терминале и не зависит от приложения GitHub Copilot.
Выводы
Git worktrees — способ работать с несколькими ветками одновременно, не прерывая текущую задачу и не рискуя запутаться в stash. Они особенно удобны при параллельной работе с ИИ-агентами и встроены в приложение GitHub Copilot по умолчанию. Попробуйте — возможно, именно они упростят ваш рабочий процесс.