Claude Code a git worktrees: dvě sessions nad jedním repem
Paralelní Claude Code sessions mi začaly dávat smysl až ve chvíli, kdy jsem je přestal pouštět nad stejným checkoutem. Předtím mi třeba jedna session psala testy k buildu blogu a druhá současně upravovala CSS. Jenže obě pracovaly se stejnými soubory. První něco změnila a commitla, druhá dál pokračovala, jako by se nic nestalo. Večer jsem pak místo kontroly výsledku zjišťoval, odkud která změna vlastně přišla. Přitom úplně zbytečně. Git na to má už roky řešení — worktrees: každá session dostane vlastní adresář a vlastní branch, ale pořád pracuje nad stejným repozitářem. Soubory si tak navzájem nepřepisují a obě mohou commitovat nezávisle na sobě.
(Všechno tady jede lokálně na mém stroji. Pokud chci úkol od počítače odstřihnout úplně, používám jiný přístup — popisuju ho v článku o Claude Code v cloudu. A pokud si potřebujete připomenout git příkazy, mám k tomu samostatný tahák.)
Jak worktrees fungují
Git worktree si můžete představit jako další pracovní adresář napojený na stejný repozitář. Historii a remote sdílí s ostatními worktrees, ale vlastní pracovní soubory a branch má oddělené. Detaily má dokumentace gitu. Pro Claude Code je podstatné jedno: dvě sessions mohou běžet nad jedním repem, každá ve svém adresáři, a jedna druhé do souborů nesáhne.
Kdy se to vyplatí
Za mě rozhodují dvě věci.
První: úkoly musí jít opravdu dělat nezávisle na sobě. Jedna session může psát testy a druhá řešit CSS. Jedna refaktorovat kód a druhá upravovat dokumentaci. Jedna opravovat bug, zatímco druhá připravuje novou feature. Jakmile ale druhá session potřebuje výsledek té první, nedává to smysl. Místo úspory času jen přidávám další větev práce, kterou musím sledovat.
Druhá: počet sessions neomezuje stroj, ale to, kolik výstupů stíhám číst. Dvě sessions uhlídám. U tří už to stojí za prd: jen přepínám mezi kontexty, review odbývám a nadělám víc škody než užitku. Ve výsledku mi jen roste hromada rozečtených diffů, ke kterým se musím postupně vracet.
Postup krok za krokem
Začínám jedním flagem:
claude --worktree testyClaude Code vytvoří worktree v .claude/worktrees/testy/, založí branch worktree-testy a session spustí právě v něm. Ve druhém terminálu můžu stejným způsobem otevřít další session pod jiným názvem a obě pak běží souběžně. Pokud název neuvedu, Claude vygeneruje vlastní, něco jako dark-chocolate-cookie. Zkratka je -w.
Doporučuju hned nastavit:
.gitignore:.claude/worktrees/si přidejte do.gitignore. Jinak vám obsah worktrees bude strašit vgit statushlavního checkoutu.- Gitignored soubory typu
.env: nový worktree je čistý checkout, takže v něm nejsou. Pokud je v jednotlivých worktrees potřebujete, vytvořte v rootu.worktreeinclude. Syntaxí funguje podobně jako.gitignore, jen v něm určíte soubory, které se mají do každého nového worktree zkopírovat. - Existující branch:
--worktreestandardně větví z default branche. Pokud ale potřebuji Claude pustit nad konkrétní rozpracovanou branchí, vytvořím si worktree ručně přes git a Claude spustím až uvnitř:
git worktree add ../oprava-formulare fix-formular
cd ../oprava-formulare
claude- Úklid: po dokončení interaktivní session se Claude postará i o úklid. Pokud je worktree čistý, smaže ho automaticky. Když v něm zůstala rozpracovaná práce, zeptá se, jestli ho chci zachovat. Aktuální stav si můžu kdykoliv zkontrolovat přes
git worktree lista nepotřebný worktree odstranit pomocígit worktree remove.
Na Macu a Windows je princip i sada příkazů stejná. Ve Windows jen uvidíte cesty se zpětnými lomítky, například .claude\worktrees\testy. A jedna věc, která mě při prvním úklidu překvapila: pokud je uvnitř worktree NTFS junction nebo symlink na adresář umístěný jinde, odstraněním worktree se smaže jen samotný odkaz. Cílový adresář zůstane na místě. Tak to je správně, jen ať vás nepřekvapí, že „složka zůstala“.
Pasti a mantinely
- Paralelní sessions neznamenají paralelní předplatné. Všechny čerpají ze stejného standardního pětihodinového okna i stejného týdenního limitu. Čím víc jich pustím současně, tím rychleji společnou kvótu spotřebovávají. Šetří to můj čas u klávesnice, ne tokeny. Pouštět tři velké úkoly paralelně ve chvíli, kdy se blížím k limitu okna, se mi proto moc nevyplácí — snadno skončím s několika rozdělanými sessions najednou, a když okno dojede, zastaví se všechny.
- Každý worktree začíná jako nový čistý checkout. To znamená žádné
node_modules, žádný virtualenv ani existující build cache. Závislosti tedy instaluju znovu pro každý nový worktree. U menšího projektu je to drobnost, u velkého monorepa už může cena za další paralelní prostředí narůst dost na to, abych si počet worktrees rozmýšlel..worktreeincludepomůže s menšími konfiguračními soubory, ale závislosti za mě samozřejmě nenainstaluje. - Nový worktree nevidí moji lokálně rozdělanou práci. Na tom jsem se při prvním použití nachytal: session mi tvrdila, že soubor neexistuje. No, jasně — v jejím checkoutu ještě vůbec nebyl. Pokud chci, aby nová session vycházela z mé aktuální práce, musím změny nejdřív commitnout. A aby worktree vznikal z commitu, na kterém právě dělám (i s tím, co jsem ještě nepushnul), a ne z default branche na remotu, nastavím v settings
worktree.baseRefna"head". - Jinak se chovají neinteraktivní běhy přes
-p. Pokud spustímclaude -p --worktree ..., závěrečný interaktivní úklid neproběhne a vytvořený worktree zůstane aktivní. Proto čas od času projdugit worktree lista nepotřebné položky odstraním přesgit worktree remove. Pokud git hlásí, že je worktree zamčený, nejdřív použijugit worktree unlock.
Závěr
Worktrees jsou pro mě jeden z nejjednodušších způsobů, jak z Claude Code dostat použitelnou paralelní práci. Nepotřebuju další infrastrukturu ani složité nastavování — stačí jeden flag a jednotlivé sessions mají oddělené pracovní soubory i branche.
Pravidla, co se mi osvědčila: paralelně pouštím jen úkoly, které na sobě nejsou závislé; počet současných sessions omezuju podle toho, kolik výsledků dokážu poctivě zkontrolovat; .claude/worktrees/ mám v .gitignore; a přes .worktreeinclude si do nových worktrees přenáším potřebné lokální konfigurace. A hlavně počítám s tím, že všechny sessions ukusují ze stejného limitu předplatného — čím víc jich je, tím rychleji pálím tokeny.
Pokud úkol můj počítač nepotřebuje vůbec — je malý, jasně ohraničený a dá se dobře zadat — raději ho pošlu rovnou do cloud session. Tam nemusím řešit izolaci ani následný úklid, protože dostanu pokaždé čerstvý sandbox. Worktrees používám hlavně tam, kde chci mít práci lokálně a průběžně ji držet pod kontrolou.