Вы делаете справочник локалей вместе с Claude Code: идёт поиск по списку, работа на середине. И тут выясняется, что в сохранённой версии страницы неверная подпись под заголовком. Исправление на две минуты, но проверять его хочется отдельно от недоделанного поиска, а не вперемешку с ним.
Разберём, как дать второй задаче собственную рабочую папку в том же репозитории, открыть в ней отдельную сессию Claude Code и в конце сохранить результат, ничего не перепутав. Сама по себе вторая папка ничего не ускоряет. Она нужна ровно для одного: чтобы две задачи не смешались в одном наборе файлов.
Когда одной рабочей папки мало
Учебный проект locale-guide - это браузерная страница со списком локалей. Сейчас в его папке идёт задача A: поиск, ветка feature/search, одна незавершённая правка:
git status --short
M app.jsТерять эту правку нельзя, а считать её готовым результатом рано. И тут появляется задача B, никак с поиском не связанная: поправить подпись в index.html в той версии, которая сохранена в main.
Первое, что приходит в голову, - открыть второй терминал и запустить там ещё один claude в той же папке. Разговоры получатся разные, а файлы у них одни и те же. Если оба исполнителя начнут менять одни участки, правки могут смешаться. В нашем простом примере подпись и поиск пока находятся в разных файлах, но обе сессии видят общий незавершённый проект. Переключение ветки тоже требует разобраться с текущими изменениями.
Выход - дать задаче B собственное рабочее место. У Git для этого есть отдельная рабочая папка того же репозитория, worktree, а у Claude Code - флаг --worktree, который готовит такую папку и сразу запускает в ней сессию. Разберём сначала механизм, потом флаг.
Оговорка сразу: это не обязательный способ работать над любой задачей. Если дерево чистое, а правка короткая, вторая папка только добавит возни. Чередовать задачи в одной папке тоже совершенно нормально.
Ветка, рабочая папка и сессия
Три вещи, которые легко перепутать, потому что вы часто работаете с ними одновременно:
| Что это | Что хранит | Где живёт |
|---|---|---|
| ветка | указатель на коммит и линию истории | в репозитории, общая для всех рабочих папок |
| рабочая папка (worktree) | файлы, с которыми вы работаете прямо сейчас, и то, что подготовлено к коммиту | на диске, у каждой папки своё |
| сессия | разговор с агентом и его контекст | в Claude Code |
Отсюда и ответ на вопрос про второй терминал: новая сессия разделяет разговор, но не файлы. Чтобы разделились файлы, нужна вторая рабочая папка.
История и ветки общие: обе папки связаны с одним репозиторием. Настройки Git по умолчанию тоже общие, хотя Git поддерживает отдельные настройки для worktree. А вот рабочие файлы и подготовленные к коммиту изменения у каждой папки свои. Незакоммиченный поиск из первой папки сам во второй не появится.
Одну и ту же ветку в двух папках одновременно обычно не открыть - Git откажется и назовёт папку, которая её уже занимает:
fatal: 'fix/label' is already used by worktree at '/projects/locale-guide-label'Выберите исходное состояние
В учебном примере репозиторий уже создан, есть хотя бы один коммит, локальная ветка main и ветка feature/search. Обе пока указывают на один коммит, а поиск существует только как незакоммиченная правка. Посмотрим исходное состояние тремя командами в основной папке:
git status --short # что не сохранено прямо сейчас
git branch --show-current # на какой ветке основная папка
git log -1 --oneline main # последний коммит в main M app.js
feature/search
d5ec405 add locale guide pageДля независимого исправления подписи берём main: задаче B нужна сохранённая версия страницы, а не текущее состояние поиска. Обратите внимание, что это локальная main на вашем компьютере. Она не обязана совпадать с одноимённой веткой в сети, и команда ничего из сети не подтягивает.
Если второй задаче нужен результат первой, сначала определитесь, какой сохранённый коммит ей нужен, и создавайте папку от него. Обычный git worktree add не переносит незакоммиченные правки автоматически. Отдельное копирование файлов или дополнительные средства подготовки окружения - другие действия.
Создайте вторую рабочую папку
Из папки locale-guide:
git worktree add -b fix/label ../locale-guide-label mainЧитается слева направо: создать новую ветку fix/label, положить рабочую папку рядом по пути ../locale-guide-label, а точкой отсчёта взять main. Последний аргумент делает выбор базы явным. Без него в этой команде Git возьмёт текущий коммит HEAD ветки feature/search, но не незакоммиченные изменения. В нашем примере ветки ещё на одном коммите, поэтому файлы получились бы одинаковыми; после коммитов по поиску выбор базы уже повлияет на результат. Git отвечает примерно так:
Preparing worktree (new branch 'fix/label')
HEAD is now at d5ec405 add locale guide pageДальше проверяем, что получилось. Флаг -C говорит Git выполнить команду в указанной папке, не переходя в неё:
git worktree list
git -C ../locale-guide-label branch --show-current
git -C ../locale-guide-label status --shortУчебный вывод с условными путями, у вас они будут свои:
/projects/locale-guide d5ec405 [feature/search]
/projects/locale-guide-label d5ec405 [fix/label]
fix/labelСписок показывает обе папки и ветку каждой из них. Основная осталась на feature/search с незавершённым поиском, новая стоит на fix/label. А status во второй папке не напечатал ничего - она чистая, и это именно то, чего мы добивались.
Если путь или имя ветки нельзя использовать, Git откажется и объяснит причину, например already exists или is already used by worktree. Проверьте список worktree, ветки и содержимое указанной папки. Это может быть ваш прежний запуск или другая задача. Не добавляйте --force наугад: сначала выясните, что уже существует и нужно ли оно.
Откройте вторую задачу в Claude Code
Откройте locale-guide-label отдельным окном IDE или просто перейдите в неё в новом терминале и запустите claude оттуда. Новая сессия ничего не знает о задаче A, и это нормально - контекст ей нужен только свой:
Ожидаемая папка: locale-guide-label, ветка: fix/label.
Сначала проверь фактическую папку и ветку. Если они другие, остановись.
Прочитай index.html.
Замени подпись под заголовком на "Список локалей: код, язык и страна".
Больше ничего в файле не меняй и покажи мне изменение.Попросите Claude Code назвать рабочую папку и текущую ветку прежде, чем он тронет файлы, и сверьте ответ с тем, что задумали. Агент, запущенный не в той папке, работает ровно так же уверенно, как и в нужной.
После правки проверьте git status и git diff в каждом из двух терминалов: во второй папке изменена только подпись в index.html, в первой сохранилась прежняя правка app.js. Один status показывает имена файлов, но не доказывает сохранность их содержимого. Для точного сравнения на время проверки приостановите работу над поиском. Проверку основной папки выполняйте из её терминала, не поручайте агенту из изолированной сессии переходить туда. Страницу открывайте именно из второй папки, иначе увидите прежнюю подпись.
Есть и короткий путь. Команда claude --worktree label-fix сама создаёт рабочую папку и запускает в ней сессию. По текущей документации папка появляется внутри репозитория, в .claude/worktrees/label-fix/, ветка получает имя worktree-label-fix, а базой служит ветка по умолчанию на удалённом репозитории (обычно main), а не ваш текущий коммит. Если удалённый репозиторий не настроен, базой станет текущий локальный коммит. То есть это не то же самое, что явно указанная main в команде выше, хотя в простом проекте результат часто совпадает. Умолчание меняется настройкой, детали стоит сверять с документацией вашей версии.
Флаг удобен, когда база вас устраивает и нужно быстро отвести отдельное место под задачу. Выполнять его поверх уже созданной папки не нужно: получится ещё одна. И .claude/worktrees/ стоит добавить в .gitignore, иначе содержимое новых папок начнёт всплывать в основной как неотслеживаемые файлы.
Что остаётся общим
Отдельная папка разделяет меньше, чем кажется на первый взгляд:
| Раздельно | Общее | Не разделяется вообще |
|---|---|---|
| рабочие файлы, подготовка к коммиту, текущая ветка папки | история, все ветки, настройки репозитория, адрес удалённого репозитория | порты локального сервера, внешняя база, облачные сервисы, доступ процесса к остальному диску |
Третья колонка - главное, о чём тут забывают. Worktree это про файлы Git, а не про изоляцию машины. Два локальных сервера на одном порту не уживутся, и запросы обеих папок уйдут к одной и той же внешней базе, если она указана в настройках. Проверки, которые Claude Code делает при работе в отдельной папке, тоже не превращают её в песочницу для всей системы.
Вторая папка получает файлы выбранного коммита. Если зависимости и локальные настройки не хранятся в Git, окружение обычно нужно подготовить отдельно; дополнительные средства могут автоматизировать эту подготовку. Копировать .env вслепую не стоит: одинаковые реквизиты могут направить оба запуска в один сервис. Нашему статическому справочнику ни сервер, ни секреты не нужны - страница открывается файлом.
Сохраните и перенесите результат
В папке B проверьте подпись в браузере, посмотрите git diff и зафиксируйте только нужный файл:
git add index.html
git diff --cached
git commit -m "fix: correct locale list label"Перед коммитом убедитесь, что подготовлена только нужная правка. Если в git diff --cached есть другие изменения, сначала разберитесь с ними.
Коммит попал в общий репозиторий, и из основной папки он уже виден. Но сам по себе он не оказался ни в main, ни в feature/search: он лежит в своей ветке и ждёт, когда вы решите его объединить.
Переносить результат стоит только тогда, когда задача A завершена или хотя бы сохранена, а основная папка чистая. Посреди незавершённого поиска переключаться на main не нужно - сначала разберитесь с ним. Когда основная папка чиста:
git checkout main
git merge fix/labelFast-forward
index.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)Этот вывод соответствует случаю, когда main не менялась после создания fix/label. Если Git сообщит о конфликте, остановитесь и разберите его по правилам слияния - это отдельная тема, она разобрана в статье "Ветки и слияние в Git". После объединения откройте страницу ещё раз: подпись должна быть новой, а список локалей - прежним. Ветка feature/search от этого не обновилась: перед продолжением поиска отдельно решите, нужно ли перенести в неё исправление из main.
Уберите ненужную папку
Сначала закройте во второй папке сессию и всё, что вы там запускали. Потом посмотрите, не осталось ли в ней чего-то нужного:
git -C ../locale-guide-label status --short --ignoredИзменённые и новые файлы видно сразу, игнорируемые показывает флаг --ignored - в них нередко лежат как раз локальные настройки и заметки. Убедились, что результат сохранён в нужной ветке, - удаляйте папку из основной:
git worktree remove ../locale-guide-label
git worktree listПри изменённых отслеживаемых или новых неигнорируемых файлах Git обычно откажется удалять папку:
fatal: '../locale-guide-label' contains modified or untracked files, use --force to delete itСовет из сообщения выполнять первым действием не надо. Проверьте файлы и сохраните нужное. Незакоммиченные данные после удаления могут оказаться невосстановимыми средствами Git. На отказ как на полную защиту рассчитывать нельзя: игнорируемые файлы могут удалиться и без --force, поэтому мы проверяли их отдельно.
И ещё одна деталь, на которой легко ошибиться. Команда Git удаляет рабочую папку, но не ветку - fix/label после неё останется в списке git branch. Это удобно: результат никуда не делся. Когда ветка действительно больше не нужна и всё нужное из неё объединено, удалите её отдельным действием.
Когда вы выходите из сессии, запущенной с --worktree, Claude Code проверяет папку. Если в ней нет изменений и новых коммитов, а у сессии нет имени, он удаляет папку и ветку сам, без вопроса. Если работа есть, он спросит, оставить папку или удалить. Удаление в этом диалоге снимает и папку, и созданную им ветку вместе со всем, что в них лежит. Это не то же самое, что команда Git выше. Нужен результат - выбирайте "оставить" и переносите его сами.
Удалять папку мимо Git, через проводник, не стоит: репозиторий продолжит считать её существующей, и в списке worktree останется запись о том, чего уже нет.
Как вести вторую задачу в Claude Code
Весь порядок умещается в шесть шагов:
- назовите вторую задачу отдельно от первой и решите, от какого сохранённого состояния она отсчитывается;
- создайте рабочую папку с явной базой или запустите
claude --worktree, если умолчание вас устраивает; - проверьте в новой папке путь и ветку, прежде чем что-то менять;
- дайте сессии контекст только этой задачи, без истории соседней;
- проверьте правку там же, где её сделали, и зафиксируйте результат;
- решите вопрос объединения, и только потом убирайте папку.
Отдельная папка не проверяет код и не принимает работу за вас. Она позволяет каждой задаче иметь свои рабочие файлы. Польза видна в нашем примере: подпись исправлена и проверена отдельно, а незавершённый поиск остался в первой папке.
Проверьте себя
Во второй папке нет незакоммиченного поиска. Что-то пошло не так?
Нет, так и задумано. Папка создана от коммита в main, а не от текущих файлов задачи A. Незакоммиченные правки остаются в своей папке.
Две сессии открыты в одной папке. Задачи разделены?
Разделены разговоры, а файлы общие. Изменения могут смешаться, если задачи затронут одни участки.
Коммит в ветке B сделан, но в main подписи нет.
Так и должно быть: коммит лежит в своей ветке. Другие ветки он не меняет, для этого нужно объединение.
Второй локальный сервер не запускается на том же порту.
Отдельная папка портов не разделяет. Запускайте на другом порту.
Git отказался удалять рабочую папку.
Прочитайте причину отказа: помимо несохранённых файлов, папка может быть заблокирована или оказаться основной рабочей папкой. Сохраните нужное и разберитесь с состоянием. Не добавляйте --force наугад.
Если хочется потренироваться руками, возьмите отдельный учебный репозиторий с парой коммитов: сделайте две папки, поменяйте текст только во второй, проверьте обе и уберите лишнюю. Никаких сервисов и аккаунтов для этого не нужно.