Тур по Git
Продвинутый Git / Урок 5.13

git worktree — Множественные рабочие деревья

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

Проблема

Вы глубоко погружены в работу над фича-веткой, когда кто-то просит вас ревьюить пул-реквест из другой ветки. Ваши варианты:

  1. Спрятать и переключиться — git stash, git checkout pr-branch, ревью, переключиться обратно, git stash pop
  2. Клонировать снова — сделать второй клон всего репозитория
  3. Использовать worktree — создать связанное рабочее дерево на другой ветке

Вариант 1 чреват ошибками (конфликты stash, забытый pop). Вариант 2 тратит дисковое пространство и время. Вариант 3 чистый и быстрый.

Создание рабочего дерева

# Создать новое рабочее дерево для существующей ветки
git worktree add ../project-review pr-branch

# Создать новое рабочее дерево с новой веткой
git worktree add ../project-experiment -b experiment

Это создаёт новую директорию с извлечённой веткой. Новая директория использует ту же историю Git — без дополнительного клонирования, без дополнительного дискового пространства для объектов.

Управление рабочими деревьями

# Список всех рабочих деревьев
git worktree list

# Вывод:
# /home/user/project          abc1234 [main]
# /home/user/project-review   def5678 [pr-branch]
# Удалить рабочее дерево по завершении
git worktree remove ../project-review

# Или просто удалите директорию и выполните prune
rm -rf ../project-review
git worktree prune

Сценарии использования

Ревью пул-реквестов во время работы

# Вы работаете над feature-x
# Кто-то открывает PR из fix/login

git worktree add ../review-login fix/login
cd ../review-login
# Запустите тесты, просмотрите код
# По завершении:
cd ../project
git worktree remove ../review-login

Запуск тестов на другой ветке

# Запуск тестов на main без покидания фича-ветки
git worktree add ../test-main main
cd ../test-main
npm test
cd ../project
git worktree remove ../test-main

Сравнение поведения между ветками

С двумя рабочими деревьями вы можете запустить обе версии приложения одновременно на разных портах и сравнить поведение бок о бок.

Worktree и рабочий процесс со stash

АспектStash + переключениеWorktree
Переключение контекстаНужно сохранять и восстанавливать состояниеМгновенно — обе ветки готовы
Риск потери работыКонфликты stash, забытые popНет — работа остаётся на месте
Одновременный запускНевозможноДа — отдельные директории
Использование дискаМинимальноеНебольшое — общие объекты Git
НастройкаНе нужнаОдна команда на каждое дополнительное дерево

Правила и ограничения

  • Каждая ветка может быть извлечена только в одном рабочем дереве одновременно
  • Рабочие деревья используют общую директорию .git, поэтому операции вроде git stash затрагивают все рабочие деревья
  • Удаление директории рабочего дерева без git worktree remove оставляет устаревшую запись (очистите с помощью git worktree prune)

Ключевые моменты

  • git worktree add <path> <branch> создаёт новое рабочее дерево для ветки
  • git worktree list показывает все активные рабочие деревья
  • git worktree remove <path> очищает рабочее дерево
  • Рабочие деревья идеальны для ревью пул-реквестов, запуска тестов или сравнения веток без нарушения текущей работы