Бывали ли вы в такой ситуации? Вы в самом разгаре разработки сложной новой функции, код готов наполовину, и вдруг приходит срочный баг, требующий немедленного исправления.
Чтобы переключить ветку (branch), вам приходится неохотно выполнять git stash, чтобы спрятать недописанный код. Исправив баг и вернувшись, вы осторожно делаете git stash pop, иногда сталкиваясь с кошмаром конфликтов кода (conflict).
На самом деле в Git давно есть мощный инструмент для решения этой проблемы — Git Worktree.
Попрощайтесь с хаотичным переключением веток и Stash и откройте для себя многопоточную разработку с Worktree
Эта статья поможет вам разобраться в его ключевых принципах и практическом применении.
В чем разница между Git Worktree и Git Branch?
Чтобы понять Git Worktree, давайте сначала выясним его отличие от Git Branch.
Мы можем сравнить контроль версий с чтением бумажной книги:
Commit— это издание / версия книгиBranch— это закладка, вложенная на определенной страницеWorktree— это рабочий стол, на котором вы раскладываете книгу
При традиционном подходе у нас есть только один рабочий стол. Каждый раз, когда нужно сменить закладку, приходится убирать все редактируемые бумаги со стола или прятать их в ящик (что и делает git stash).
В то же время Git Worktree позволяет вам иметь несколько независимых рабочих столов одновременно.
| Критерий сравнения | Git Branch | Git Worktree |
|---|---|---|
| Концепция Workspace | Использует один физический рабочий каталог | Имеет несколько независимых физических рабочих каталогов |
| Затраты на переключение | Требуются commit, stash или сохранение изменений | Без stash; достаточно просто перейти в другой каталог |
| Изоляция и безопасность | Незакоммиченные файлы могут вызвать конфликты | Каталоги полностью изолированы, изменения не мешают друг другу |
| История изменений | Использует общую историю Commit и веток Git | Использует общую историю Commit и веток Git |
Текущая ветка, Staging Area и незакоммиченные изменения в каждом Worktree полностью независимы, но они используют общую историю Commit и записи веток.
Branch — это закладка версии, а Worktree — это физический рабочий стол
Таким образом, когда вам нужно переключить задачу, вы просто открываете другой каталог с папкой, абсолютно не меняя текущее состояние разработки.
Как начать использовать Git Worktree?
При внедрении Git Worktree в реальные проекты грамотное планирование каталогов делает разработку значительно более гладкой.
Рекомендуется сохранять исходный каталог проекта, клонированный через git clone, как чистый штаб main, а новые каталоги Worktree размещать за пределами основного проекта (например, ../my-app-worktrees), чтобы избежать ошибок рекурсивного сканирования инструментами разработки.
Типичный порядок команд выглядит следующим образом:
| Этап | Команда |
|---|---|
| 1. Создать новый Worktree и одновременно новую ветку | git worktree add ../my-app-worktrees/feature-login -b feature-login |
| 2. Просмотреть список всех текущих Worktree | git worktree list |
Git Worktree отлично подходит для управления задачами разработки AI Agent.
Вы можете выделить AI Agent отдельный каталог Worktree, чтобы он свободно вносил изменения и тестировал их, пока разработчик-человек выполняет ревью кода (Review) и тестирование в другом Worktree.
Выделите AI Agent отдельный Worktree, чтобы разработка ИИ и проверка человеком выполнялись параллельно
Оба работают в своих физических каталогах, что безопасно и наглядно.
Как безопасно слить изменения и выполнить очистку после завершения разработки?
После завершения работы в отдельном Worktree, как объединить результаты и произвести очистку?
Запомните важную концепцию: Сам каталог Worktree сливать не нужно, сливать нужно именно Branch.
Вам нужно лишь вернуться в рабочий каталог main и выполнить команду git merge для соответствующей ветки функции, чтобы завершить интеграцию.
Для очистки следуйте стандартной двухшаговой процедуре:
| Шаг | Команда |
|---|---|
| 1. Удалить физический каталог Worktree | git worktree remove ../my-app-worktrees/feature-login |
| 2. Удалить завершенную ветку функции | git branch -d feature-login |
Сначала удалите каталог Worktree, затем удалите Branch
Обязательно используйте команду git worktree remove для очистки, вместо ручного удаления папки через проводник.
Каковы распространенные подводные камни при использовании Git Worktree?
Хотя Git Worktree очень удобен, при его использовании есть несколько нюансов, на которые стоит обратить внимание.
Подводный камень 1: Потеря незакоммиченных изменений
Хотя удаление Worktree не удаляет саму ветку, если у вас в этом каталоге остались незакоммиченные изменения, принудительное удаление каталога Worktree приведет к их безвозвратной потере.
Подводный камень 2: Конфликт занятости ветки
Защитный механизм Git не позволяет выполнять Checkout одной и той же ветки одновременно в двух разных Worktree. Если вы попытаетесь переключиться на уже занятую ветку во втором Worktree, Git заблокирует действие и выдаст ошибку.
Принудительное удаление Worktree приведет к потере несохраненных через Commit изменений
Освоив эти особенности и принципы, вы легко избежите ошибок.
Заключение
Благодаря Git Worktree мы можем навсегда попрощаться с хаотичным переключением веток и процессом git stash, достигнув настоящей многопоточной разработки.
В следующий раз, когда вам понадобится срочно исправить баг, вести разработку нескольких функций одновременно или поручить задачи по написанию кода AI Agent, попробуйте открыть новый рабочий стол!