Несколько задач в одном репозитории

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 status. remove --force может удалить несохранённые и неотслеживаемые файлы.

Рабочий сценарий

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.

В примерах project — основная папка репозитория, main — базовая ветка. Замените имена на свои.