Инструменты

Git worktree: как работать над несколькими задачами одновременно без stash

Знакомая ситуация: вы на середине фичи, ещё не готовой к коммиту, и тут прилетает срочный баг-фикс. Обычный путь — git stash, переключиться на нужную ветку, поправить баг, вернуться, сделать git stash pop и понадеяться, что ничего не потерялось и не конфликтует. Если проект собирается не мгновенно, к этому добавляется ещё и пересборка после каждого переключения. Git worktree решает эту проблему не процессом, а инструментом: вместо переключения контекста в одной папке вы получаете несколько папок с одним и тем же репозиторием.

Что такое worktree на самом деле

По умолчанию у репозитория git есть один рабочий каталог (worktree) — папка, куда извлечено содержимое текущей ветки, и один специальный каталог .git с историей, объектами и настройками. Команда git worktree add не клонирует репозиторий заново — она создаёт ещё одну рабочую папку, которая ссылается на тот же .git, но извлекает в себя отдельную ветку. История, объекты, настройки remote — всё общее и хранится один раз. Разными остаются только файлы на диске и то, какая ветка сейчас в них извлечена.

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

Как создать и убрать worktree

Базовый сценарий — три команды. Сначала смотрим, что уже есть:

git worktree list

Дальше создаём новую рабочую папку под конкретную задачу — например, для срочного багфикса, пока основная папка занята незакоммиченной фичей:

git worktree add ../myproject-hotfix hotfix/urgent-bug

Эта команда создаст соседнюю папку myproject-hotfix, извлечёт туда ветку hotfix/urgent-bug (если её ещё нет — можно сразу добавить флаг -b, чтобы создать новую ветку от текущего HEAD) и подключит её к тому же репозиторию. Дальше это обычная папка: можно открыть в редакторе, запустить тесты, собрать проект отдельно от основной рабочей копии.

Когда задача закрыта, worktree убирается так же просто:

git worktree remove ../myproject-hotfix

Если папку удалили руками, а git всё ещё думает, что worktree существует, поможет git worktree prune — она уберёт из внутреннего списка ссылки на каталоги, которых больше нет на диске.

Где это реально экономит время

Worktree не заменяет ветки — он даёт каждой активной задаче собственное место на диске, чтобы переключение контекста не превращалось в ритуал со stash и надеждой, что ничего не потерялось.

На что обратить внимание

У подхода есть свои нюансы, которые стоит знать заранее, а не выяснять на практике в неудобный момент.

Во-первых, каждый worktree — это полноценная копия файлов на диске, а не облегчённая ссылка: если проект тяжёлый или в нём много зависимостей вроде node_modules, несколько worktree начнут заметно есть место на диске. Их придётся либо переустанавливать в каждой папке отдельно, либо выносить в общее место через инструменты уровня выше git.

Во-вторых, не стоит заводить worktree «про запас» на каждую мелкую задачу — если рабочих копий становится больше пяти-шести, начинает теряться смысл: вы снова тратите время, но уже на то, чтобы вспомнить, в какой из папок что происходит. Практический ориентир — держать worktree под каждую реально параллельную задачу, а не под каждую ветку, которая теоретически может понадобиться.

В-третьих, worktree — это фича самого git, а не конкретного хостинга или клиента, поэтому она одинаково доступна из терминала, но не всегда одинаково удобно показана в GUI-клиентах и интегрированных средах разработки — стоит один раз проверить, как ваш редактор отображает несколько worktree одного репозитория, прежде чем полагаться на этот рабочий процесс постоянно.

В сумме git worktree — не замена веткам и не замена stash полностью, а дополнительный инструмент для конкретной проблемы: параллельной работы над несколькими задачами в одном репозитории без постоянного переключения контекста в одной и той же папке. Если вы регулярно ловите себя на цепочке «stash → checkout → работа → checkout обратно → stash pop», это ровно тот случай, когда стоит один раз настроить worktree и забыть про эту рутину.

← Все статьи
Я люблю Алину Цой (Билялову)