Git worktree:
каждой ветке — папку.
Работать над разными ветками одновременно, сохраняя незавершённые изменения на месте. Общая история коммитов, отдельные рабочие файлы, HEAD и индекс.
Создать рабочую папку
git worktree add -b feature/name ../project-feature main
Создать новую ветку feature/name от main и открыть её в отдельной папке. Ветка ещё не должна существовать.
git worktree add ../project-hotfix hotfix
Открыть существующую ветку hotfix. Она не должна быть открыта в другом worktree.
git fetch origin
Получить актуальные удалённые ветки перед созданием рабочей папки.
git worktree add --track -b feature/name ../project-feature origin/feature/name
Создать локальную ветку с отслеживанием существующей удалённой ветки.
git worktree add --detach ../project-review HEAD
Создать папку для просмотра или экспериментов на текущем коммите без привязки к ветке.
Ориентация и работа
git worktree list
Показать все рабочие папки, их коммиты и ветки.
git worktree list --porcelain
Вывести сведения в формате, удобном для скриптов.
cd ../project-feature
Перейти в рабочую папку задачи. Здесь доступны обычные команды Git.
git status
Проверить изменения и текущую ветку именно этой рабочей папки.
git switch -c review
Создать ветку в папке с detached HEAD, чтобы сохранить новые коммиты под именем.
Переместить и восстановить
git worktree move ../project-feature ../project-ui
Переместить связанный worktree с обновлением служебных ссылок. Не работает для основного worktree и папок с подмодулями.
git worktree repair ../project-ui
Из основного репозитория восстановить связи с новым путём после ручного перемещения связанной папки.
Защитить регистрацию
git worktree lock --reason "External drive" ../project-feature
Защитить запись от очистки, если папка находится на временно отключаемом диске. Также блокирует обычные move и remove.
git worktree unlock ../project-feature
Снять блокировку. Сам lock не запрещает редактировать файлы и создавать коммиты.
Удалить и очистить
git worktree remove ../project-feature
Удалить чистую связанную рабочую папку. Ветка и её коммиты остаются в репозитории.
git branch -d feature/name
Отдельно удалить уже объединённую ветку после удаления её worktree.
git worktree prune --dry-run
Посмотреть, какие устаревшие служебные записи будут очищены. Учитывается срок хранения записей.
git worktree prune
Очистить устаревшие записи папок, которые были удалены вручную. Не удаляет существующие рабочие папки.
Рабочий сценарий
git worktree add -b feature/name ../project-feature main
Из основной папки project создать ветку и отдельную рабочую папку.
cd ../project-feature
Перейти к задаче, внести изменения и установить зависимости при необходимости.
git add path/to/file
Подготовить нужные изменения к коммиту.
git commit -m "Add feature"
Сохранить работу в ветке feature/name.
cd ../project
Вернуться в основную рабочую папку с чистым состоянием.
git switch main
Выбрать ветку, в которую будут объединены изменения.
git merge feature/name
Объединить работу. При конфликтах сначала разрешить их и завершить merge.
git worktree remove ../project-feature
Удалить связанную папку после успешного объединения.
git branch -d feature/name
Удалить объединённую локальную ветку.
Что помнить
Одна ветка — один worktree
По умолчанию Git не разрешает открыть одну ветку в двух рабочих папках. Для просмотра используйте --detach.
Окружение каждой папки
Неотслеживаемые файлы, .env и установленные зависимости автоматически не копируются. Настройте окружение новой папки отдельно.
Общая история и ветки
Коммиты и ссылки на ветки общие для репозитория. Изменения файлов и индекс принадлежат конкретному worktree.