S Claude Code vytváříte přehled lokalizací a hledání v seznamu máte zhruba napůl hotové. A v tu chvíli zjistíte, že v uložené verzi stránky je pod nadpisem chybný popisek. Oprava zabere dvě minuty, ale chcete ji ověřit zvlášť, ne spolu s rozpracovaným hledáním.

Ukážeme si, jak dát druhému úkolu vlastní pracovní složku ve stejném repozitáři, otevřít v ní samostatnou relaci Claude Code a nakonec uložit výsledek bez zmatků. Druhá složka sama o sobě práci nezrychlí. Má jediný účel: aby se dva úkoly nemíchaly v jedné sadě souborů.

Když jedna pracovní složka nestačí

Ukázkový projekt locale-guide je webová stránka se seznamem lokalizací. Právě v jeho složce probíhá úkol A: hledání, větev feature/search a jedna nedokončená změna:

git status --short
M app.js

O tuto změnu nechcete přijít, ale za hotový výsledek ji zatím považovat nemůžete. A právě teď přichází úkol B, který s hledáním nesouvisí: opravit popisek v souboru index.html ve verzi uložené ve větvi main.

První nápad bývá otevřít druhý terminál a spustit v něm další claude ve stejné složce. Rozhovory budou oddělené, soubory ale zůstanou společné. Pokud oba agenti začnou měnit stejná místa, změny se mohou promíchat. V našem jednoduchém příkladu jsou popisek a hledání zatím v různých souborech, obě relace ale vidí stejný rozpracovaný projekt. Přepnutí větve navíc vyžaduje vyřešit aktuální změny.

Řešením je dát úkolu B vlastní pracovní prostor. Git k tomu nabízí samostatnou pracovní složku téhož repozitáře, worktree, a Claude Code má přepínač --worktree, který takovou složku připraví a rovnou v ní spustí relaci. Nejdřív si ukážeme princip, potom přepínač.

Jeden repozitář a tři pracovní složky, v každé vlastní větev: main, feature-a a feature-b
Jeden repozitář, několik pracovních složek, každá má vlastní větev. Názvy na obrázku jsou ilustrační; v našem příkladu jsou dvě pracovní složky a tři větve: main, feature/search a fix/label.

Jedna výhrada hned na úvod: tento postup není povinný pro každý úkol. Pokud je pracovní strom čistý a změna malá, druhá složka přidá jen zbytečnou práci. Střídat úkoly v jedné složce je také naprosto v pořádku.

Větev, pracovní složka a relace

Tyto tři věci se snadno pletou, protože s nimi často pracujete současně:

Co to jeCo uchováváKde se nachází
větevukazatel na commit a linii historiev repozitáři, společná pro všechny pracovní složky
pracovní složka (worktree)soubory, se kterými právě pracujete, a změny připravené ke commituna disku, každá složka má vlastní
relacerozhovor s agentem a jeho kontextv Claude Code

A tím se dostáváme k otázce druhého terminálu: nová relace oddělí rozhovor, ne však soubory. Pokud chcete oddělit soubory, potřebujete druhou pracovní složku.

Jeden repozitář, dvě pracovní složky, každá má vlastní větev a relaci Claude CodeJeden repozitářlocale-guidevětevfeature/searchrelace Claude Codeúkol A, hledánívětevfix/labelrelace Claude Codeúkol B, popisekPracovní složkalocale-guidePracovní složkalocale-guide-labelNecommitnuté změny zůstávají ve své složce
Historie a seznam větví jsou společné, soubory a relace oddělené

Historie a větve jsou společné: obě složky jsou napojené na jeden repozitář. Ve výchozím stavu je společná také konfigurace Gitu, i když Git podporuje samostatná nastavení pro worktree. Pracovní soubory a změny připravené ke commitu má ale každá složka vlastní. Necommitnuté hledání z první složky se samo v té druhé neobjeví.

Stejnou větev obvykle nelze otevřít současně ve dvou složkách. Git to odmítne a oznámí, která složka ji už používá:

fatal: 'fix/label' is already used by worktree at '/projects/locale-guide-label'

Vyberte výchozí stav

V ukázce je repozitář už vytvořený, obsahuje alespoň jeden commit a místní větve main a feature/search. Obě zatím ukazují na stejný commit a hledání existuje jen jako necommitnutá změna. Podívejme se na výchozí stav třemi příkazy v hlavní složce:

git status --short        # co právě není uložené
git branch --show-current # na které větvi je hlavní složka
git log -1 --oneline main # poslední commit ve větvi main
 M app.js
feature/search
d5ec405 add locale guide page

Pro nezávislou opravu popisku vybereme main: úkol B potřebuje uloženou verzi stránky, ne současný stav hledání. Jde o místní větev main na vašem počítači. Nemusí odpovídat stejně pojmenované větvi na serveru a tento příkaz z něj nic nestahuje.

Pokud druhý úkol potřebuje výsledek prvního, nejdřív určete, který uložený commit má použít, a složku vytvořte z něj. Běžný příkaz git worktree add necommitnuté změny automaticky nepřenáší. Samostatné kopírování souborů nebo další nástroje pro přípravu prostředí jsou jiné kroky.

Vytvořte druhou pracovní složku

Z adresáře locale-guide spusťte:

git worktree add -b fix/label ../locale-guide-label main

Zleva doprava příkaz znamená: vytvořit novou větev fix/label, umístit pracovní složku hned vedle, do ../locale-guide-label a jako výchozí bod použít main. Poslední argument volbu základu výslovně určuje. Bez něj Git v tomto příkazu použije aktuální commit HEAD větve feature/search, nikoli necommitnuté změny. V našem příkladu obě větve zatím ukazují na stejný commit, takže soubory by byly totožné; po commitech s hledáním už výběr základu ovlivní výsledek. Git odpoví přibližně takto:

Preparing worktree (new branch 'fix/label')
HEAD is now at d5ec405 add locale guide page

Teď ověříme výsledek. Přepínač -C říká Gitu, aby příkaz provedl v určené složce, aniž byste do ní museli přejít:

git worktree list
git -C ../locale-guide-label branch --show-current
git -C ../locale-guide-label status --short

Ukázkový výpis s ilustračními cestami; u vás budou jiné:

/projects/locale-guide        d5ec405 [feature/search]
/projects/locale-guide-label  d5ec405 [fix/label]

fix/label

Výpis ukazuje obě složky i větev přiřazenou každé z nich. Hlavní zůstala na feature/search s rozpracovaným hledáním, nová je na fix/label. Příkaz status ve druhé složce nic nevypsal - je čistá, přesně o to nám šlo.

Pokud cestu nebo název větve nelze použít, Git to odmítne a vysvětlí proč, například hláškou already exists nebo is already used by worktree. Zkontrolujte seznam worktree, větve a obsah uvedené složky. Může jít o vaši dřívější relaci nebo jiný úkol. Nepřidávejte naslepo --force: nejdřív zjistěte, co už existuje a zda to potřebujete.

Otevřete druhý úkol v Claude Code

Otevřete složku locale-guide-label v samostatném okně IDE, nebo do ní přejděte v novém terminálu a spusťte odtud claude. Nová relace o úkolu A nic neví, což je v pořádku - potřebuje jen vlastní kontext:

Očekávaná složka: locale-guide-label, větev: fix/label.
Nejdřív ověř skutečnou složku a větev. Pokud jsou jiné, zastav se.
Přečti index.html.
Změň popisek pod nadpisem na "Seznam lokalizací: kód, jazyk a země".
V souboru už nic dalšího neměň a ukaž mi provedenou změnu.
Před první změnou ověřte složku

Než Claude Code sáhne na soubory, požádejte ho, aby uvedl pracovní složku a aktuální větev, a porovnejte odpověď se svým záměrem. Agent spuštěný ve špatné složce pracuje stejně sebejistě jako v té správné.

Po úpravě spusťte v obou terminálech git status a git diff: ve druhé složce se změnil jen popisek v index.html, v první zůstala původní změna v app.js. Samotný výpis status ukazuje názvy souborů, ne to, zda zůstal zachovaný jejich obsah. Kvůli přesnému porovnání práci na hledání během kontroly pozastavte. Hlavní složku kontrolujte v jejím vlastním terminálu, agentovi v izolované relaci nezadávejte, aby do ní přecházel. Stránku otevřete právě z druhé složky, jinak uvidíte původní popisek.

Existuje i kratší cesta. Příkaz claude --worktree label-fix sám vytvoří pracovní složku a spustí v ní relaci. Podle aktuální dokumentace se složka objeví uvnitř repozitáře, ve složce .claude/worktrees/label-fix/, větev dostane název worktree-label-fix a základem je výchozí větev vzdáleného repozitáře (obvykle main), nikoli váš aktuální commit. Pokud vzdálený repozitář není nastavený, použije se aktuální místní commit. Není to tedy totéž jako výslovně zadaná větev main v předchozím příkazu, i když v jednoduchém projektu bývá výsledek často stejný. Výchozí chování lze změnit nastavením; podrobnosti ověřte v dokumentaci ke své verzi.

Přepínač se hodí, když vám výchozí základ vyhovuje a chcete rychle vytvořit samostatné místo pro úkol. Nespouštějte ho uvnitř už vytvořené složky, jinak vznikne další. Cestu .claude/worktrees/ také přidejte do souboru .gitignore, jinak se obsah nových složek začne v hlavní složce objevovat jako nesledované soubory.

Co zůstává společné

Samostatná složka odděluje méně věcí, než by se na první pohled mohlo zdát:

OddělenéSpolečnéVůbec se neodděluje
pracovní soubory, příprava ke commitu, aktuální větev složkyhistorie, všechny větve, nastavení repozitáře, adresa vzdáleného repozitářeporty místního serveru, externí databáze, cloudové služby, přístup procesu ke zbytku disku

Třetí sloupec je to hlavní, na co se často zapomíná. Worktree odděluje soubory v Gitu, ne celý počítač. Dva místní servery nemohou používat stejný port a požadavky z obou složek budou směřovat do stejné externí databáze, pokud je tak nastavena. Ani kontroly, které Claude Code provádí při práci v samostatné složce, z ní nedělají sandbox pro celý systém.

Druhá složka obsahuje soubory zvoleného commitu. Pokud Git nesleduje závislosti a místní nastavení, prostředí je obvykle potřeba připravit zvlášť; další nástroje mohou tento krok automatizovat. Nekopírujte naslepo soubor .env: stejné přístupové údaje mohou oba běhy nasměrovat do jedné služby. Náš statický přehled nepotřebuje server ani tajné klíče - stránku otevřete jako soubor.

Uložte a přeneste výsledek

Ve složce B ověřte popisek v prohlížeči, prohlédněte si výpis git diff a zaznamenejte pouze potřebný soubor:

git add index.html
git diff --cached
git commit -m "fix: correct locale list label"

Před commitem se ujistěte, že je připravená pouze požadovaná změna. Pokud výpis git diff --cached obsahuje i něco dalšího, nejdřív to vyřešte.

Commit se dostal do společného repozitáře a z hlavní složky ho už vidíte. Sám od sebe se ale nedostal do větve main ani feature/search: zůstává ve své větvi a čeká, až se rozhodnete ho sloučit.

Výsledek přenášejte až ve chvíli, kdy je úkol A dokončený nebo alespoň uložený a hlavní složka je čistá. Uprostřed rozpracovaného hledání nepřepínejte na větev main - nejdřív vyřešte jeho stav. Jakmile je hlavní složka čistá:

git checkout main
git merge fix/label
Fast-forward
index.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

Tento výpis odpovídá situaci, kdy se větev main od vytvoření fix/label nezměnila. Pokud Git oznámí konflikt, zastavte se a vyřešte ho podle pravidel pro slučování - to je samostatné téma popsané v článku "Větve a slučování v Gitu". Po sloučení stránku znovu otevřete: popisek má být nový, seznam lokalizací stejný jako předtím. Větev feature/search se tím neaktualizovala. Než budete pokračovat v hledání, rozhodněte zvlášť, zda do ní chcete přenést opravu z main.

Odstraňte nepotřebnou složku

Nejdřív ve druhé složce ukončete relaci a vše, co jste v ní spustili. Pak zkontrolujte, zda v ní nezůstalo něco důležitého:

git -C ../locale-guide-label status --short --ignored

Změněné a nové soubory uvidíte hned, ignorované zobrazí přepínač --ignored - často v nich bývá místní nastavení a poznámky. Jakmile ověříte, že je výsledek uložený ve správné větvi, odstraňte ji příkazem z hlavní složky:

git worktree remove ../locale-guide-label
git worktree list

Pokud jsou ve složce změněné sledované nebo nové neignorované soubory, Git její odstranění obvykle odmítne:

fatal: '../locale-guide-label' contains modified or untracked files, use --force to delete it

Radou z chybové hlášky se neřiďte hned jako prvním krokem. Zkontrolujte soubory a uložte vše potřebné. Necommitnutá data už po odstranění složky nemusí jít prostředky Gitu obnovit. Na odmítnutí se nelze spoléhat jako na úplnou ochranu: ignorované soubory se mohou odstranit i bez přepínače --force, proto jsme je kontrolovali zvlášť.

Ještě jedna věc, na kterou se snadno zapomene. Příkaz Gitu odstraní pracovní složku, nikoli větev - fix/label zůstane v seznamu git branch. To je praktické: o výsledek jste nepřišli. Až větev opravdu nebudete potřebovat a vše důležité z ní bude sloučené, odstraňte ji samostatným příkazem.

Dialog Claude Code funguje jinak

Když ukončíte relaci spuštěnou s přepínačem --worktree, Claude Code složku zkontroluje. Pokud v ní nejsou změny ani nové commity a relace nemá vlastní název, bez dotazu odstraní složku i větev. Pokud v ní práce zůstala, zeptá se, zda chcete složku ponechat, nebo odstranit. Odstranění v tomto dialogu smaže složku i vytvořenou větev včetně jejich obsahu. Není to totéž jako výše uvedený příkaz Gitu. Chcete-li si výsledek nechat, zvolte "ponechat" a přeneste ho sami.

Neodstraňujte složku mimo Git, například v Průzkumníku souborů. Repozitář ji bude dál považovat za existující a v seznamu worktree zůstane záznam o něčem, co už neexistuje.

Jak pracovat na druhém úkolu v Claude Code

Celý postup se dá shrnout do šesti kroků:

  1. pojmenujte druhý úkol odděleně od prvního a rozhodněte, z jakého uloženého stavu má vycházet;
  2. vytvořte pracovní složku s výslovně zadaným základem, nebo spusťte claude --worktree, pokud vám vyhovuje výchozí nastavení;
  3. v nové složce před jakoukoli změnou ověřte cestu a větev;
  4. dejte relaci kontext pouze k tomuto úkolu, bez historie toho druhého;
  5. změnu zkontrolujte tam, kde jste ji provedli, a zaznamenejte výsledek;
  6. vyřešte sloučení a teprve potom složku odstraňte.

Samostatná složka nekontroluje kód ani za vás neschvaluje výsledek. Každému úkolu jen poskytuje vlastní pracovní soubory. V našem příkladu je přínos jasný: popisek jsme opravili a ověřili zvlášť, zatímco nedokončené hledání zůstalo v první složce.

Ověřte si, že tomu rozumíte

Ve druhé složce není necommitnuté hledání. Pokazilo se něco?
Ne, tak je to správně. Složka vznikla z commitu ve větvi main, ne z aktuálních souborů úkolu A. Necommitnuté změny zůstávají ve své složce.

Jsou ve stejné složce otevřené dvě relace. Jsou úkoly oddělené?
Oddělené jsou rozhovory, soubory jsou společné. Pokud úkoly zasáhnou stejná místa, změny se mohou promíchat.

Commit ve větvi B je hotový, ale v main popisek chybí.
To je v pořádku: commit zůstává ve své větvi. Ostatní větve nezmění, k tomu je potřeba sloučení.

Druhý místní server nelze spustit na stejném portu.
Samostatná složka porty neodděluje. Spusťte server na jiném portu.

Git odmítl odstranit pracovní složku.
Přečtěte si důvod odmítnutí: kromě neuložených souborů může být složka zamčená nebo může jít o hlavní pracovní složku. Uložte vše potřebné a vyřešte její stav. Nepřidávejte naslepo přepínač --force.

Chcete-li si postup vyzkoušet, použijte samostatný cvičný repozitář s několika commity: vytvořte dvě složky, změňte text jen ve druhé, obě zkontrolujte a nepotřebnou odstraňte. Nepotřebujete k tomu žádné služby ani účty.