git worktree — Множественные рабочие деревья
Обычно Git-репозиторий имеет одну рабочую директорию, привязанную к одной ветке. git worktree позволяет иметь несколько рабочих директорий, каждая из которых переключена на свою ветку — и все они используют общие данные .git.
Проблема
Вы глубоко погружены в работу над фича-веткой, когда кто-то просит вас ревьюить пул-реквест из другой ветки. Ваши варианты:
- Спрятать и переключиться —
git stash,git checkout pr-branch, ревью, переключиться обратно,git stash pop - Клонировать снова — сделать второй клон всего репозитория
- Использовать 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>очищает рабочее дерево- Рабочие деревья идеальны для ревью пул-реквестов, запуска тестов или сравнения веток без нарушения текущей работы