Чтобы работать со второй веткой, не затрагивая текущую рабочую копию проекта на Mac, создайте Git worktree в соседней папке. У каждого worktree есть собственные файлы и переключенная ветка, при этом данные репозитория разделяются с основной рабочей копией. Создайте его из Терминала, откройте папку в Finder или в редакторе, а по завершении удалите с помощью Git. Документация Git по worktree

Что меняет worktree

Worktree предоставляет вам еще один рабочий каталог, подключенный к тому же репозиторию Git. Это означает, что вы можете, например, оставить открытой текущую рабочую копию main, в то время как для тематической ветки (feature branch) будет выделена отдельная папка с файлами. Изменения в одном рабочем каталоге не перезаписывают извлеченные файлы в другом. Git разделяет общие данные репозитория, но хранит специфичные для каждого worktree состояния, такие как индекс и HEAD, раздельно. Git: git-worktree

Ветки являются общими для всех worktree, и локальную ветку обычно нельзя переключить в двух worktree одновременно. Worktree подходят для отдельных параллельных задач; они не являются независимыми клонами репозитория. Файлы, игнорируемые Git, такие как локальные конфигурации или результаты сборки, возможно, потребуется создать в новой папке отдельно.

Создание feature-worktree в macOS

Откройте Терминал и перейдите в существующий каталог вашего проекта. Замените my-app именем каталога вашего репозитория. В примере предполагается, что он находится в ~/Projects/my-app, и новая рабочая копия создается рядом с ним.

cd ~/Projects/my-app
git status --short
git worktree add -b feature/search-ui ../my-app-search-ui

Команда status позволяет увидеть, есть ли в текущей рабочей копии незафиксированные изменения, перед сменой контекста. Команда add -b создает новую локальную ветку с именем feature/search-ui и извлекает ее в соседний каталог my-app-search-ui. Если начальный коммит не указан, Git создает ветку от текущего HEAD. Выберите уникальную ветку и путь назначения, который еще не используется. Git: worktree add

Для существующей локальной ветки, которая не переключена в другом worktree, используйте ее имя вместо -b и названия новой ветки:

git worktree add ../my-app-search-ui existing-branch

Если ветка уже извлечена в другом месте, Git по умолчанию выдаст отказ. Не применяйте принудительный запуск только для обхода защиты; используйте другую ветку или работайте в той копии, которой она уже принадлежит. Чтобы создать worktree для удаленной ветки, при необходимости сначала выполните fetch и следуйте стандартному поведению отслеживания веток Git; перед добавлением проверьте имя ветки.

Открытие новой рабочей копии в Finder и редакторе

В Finder перейдите в родительскую папку, содержащую оба каталога проектов, затем откройте my-app-search-ui. Вы можете воспользоваться командой Finder «Переход к папке» (Shift-Command-G) и ввести полный путь, например ~/Projects/my-app-search-ui. Следите за тем, чтобы имя каталога отображалось в Finder или вашем редакторе, чтобы отличать его от исходной рабочей копии.

Apple также описывает способ открытия Терминала в выбранной папке из Finder: включите строку пути через Вид > Показать строку пути, нажмите на папку в строке пути, удерживая Control, и выберите «Открыть в Терминале». Чтобы открыть еще одно окно или вкладку Терминала, используйте Command-N или Command-T. Расположение выбранной папки станет рабочим каталогом для действия Finder. Apple: Открытие новых окон и вкладок Терминала на Mac

Откройте новую папку как отдельный проект в вашем редакторе, используя стандартную функцию открытия папок этого редактора. Поведение редакторов различается; Git worktree не открывают автоматически окна редактора и не настраивают среду разработки. Папки с зависимостями, игнорируемые файлы, локальные файлы конфигурации окружения и запущенные службы могут потребовать отдельной настройки в каждой рабочей копии.

Проверка используемой рабочей копии

Из любого каталога проекта выполните:

git worktree list

Git выведет список основного и связанных worktree, включая их пути и извлеченные ветки. Перед фиксацией коммитов или выполнением команд, изменяющих файлы, проверьте текущую папку или выполните в ней git status. Эта простая проверка помогает избежать распространенной ошибки — внесения правок в исходную рабочую копию, когда вы намеревались работать в новой. Git: worktree list

Удаление worktree после выполнения задачи

Сначала зафиксируйте в коммите или сохраните иным способом всю необходимую работу. Затем из любого worktree, принадлежащего репозиторию, удалите связанную рабочую копию по пути к ней:

git worktree remove ../my-app-search-ui
git worktree list

Обычно Git отказывается удалять worktree, содержащее измененные отслеживаемые файлы или неотслеживаемые файлы. Проверьте и сохраните эти файлы перед удалением; флаг --force отменяет защиту Git и может привести к потере наработок. Команда удаляет сам каталог worktree, поэтому не используйте ее, не проверив предварительно, что находится внутри. После удаления ветка остается доступной в репозитории, если ее не удалить отдельно. Git: worktree remove

Если вы удалили папку worktree вручную, Git может сохранить административную запись о ней. Используйте git worktree prune для очистки устаревших записей; для стандартной очистки предпочтительнее использовать git worktree remove. Если вы переместите связанную рабочую копию в Finder, Git может потерять информацию о ее местоположении; используйте команду git worktree move, если это применимо, или git worktree repair, чтобы восстановить связь. Git: worktree prune, move и repair

Практичный подход для Mac — создавать отдельную папку worktree для каждой активной задачи с короткими, понятными названиями папок и веток. Оставьте основную рабочую копию для текущих дел, создайте соседнюю копию для параллельной задачи и проверяйте путь перед редактированием. Это обеспечит каждую задачу собственными файлами проекта без необходимости постоянно переключать ветку в исходной рабочей копии.

Источники