# Her ajana ayrı bir checkout

İki ajan aynı klasörde çalışırsa birbirinin işini ezer. Worktree her oturuma kendi dosyalarını ve kendi dalını verir, paralel işler siz birleştirene kadar ayrı kalır.

## Aynı klasör neden olmuyor

Aynı repoda iki Claude Code oturumu açın ve ikisinden iki farklı özellik isteyin. İkisi de aynı dosyaları okuyor, aynı dosyaları düzenliyor ve test paketini, öbürünün altından çekip aldığı bir ağaç üzerinde çalıştırıyor. Kırmızı çıkan test sizin olabilir, diğer ajanın yarım kalmış değişikliği de olabilir.

Sorun model değil. Tek bir çalışma klasörü aynı anda yalnızca tek bir durumu tutabilir. Çözüm klasörü paylaşmaktan vazgeçmek.

## Worktree ne veriyor

Git **worktree**, aynı reponun ikinci bir checkout'u: kendi klasöründe, kendi dalında. Geçmiş ve nesneler ortak, bu yüzden ucuz. Düzenlediğiniz dosyalar ortak değil, bu yüzden oturumlar birbirinin ayağına basamıyor.

Claude Code bunu yerleşik olarak getiriyor. `claude --worktree name` (ya da `-w`), `.claude/worktrees/<name>/` klasörünü `worktree-<name>` adlı bir dalda oluşturup oturumu orada başlatıyor. İsim vermezseniz `bright-running-fox` gibi rastgele bir isim çıkıyor.

```flow
A oturumu "search" worktree'sinde başlar
B oturumu "billing" worktree'sinde başlar
Her biri yalnızca kendi klasörünü düzenler
Her biri kendi dalına commit atar
Siz sırayla inceleyip birleştirirsiniz
```

`.claude/worktrees/` satırını `.gitignore`'a ekleyin. Yoksa bu klasörler ana checkout'ta izlenmeyen dosya olarak görünür.

**Question:** İki oturum farklı özelliklere dokunsa bile aynı klasörde çalışmak neden sorun?

- Claude Code ikinci oturumu başlatmayı reddeder
- Aynı dosya kümesini paylaşırlar, düzenlemeler ve test çalıştırmaları birbirini bozar
- Git bir repoda tek dala izin verir
- Bağlam pencereleri birleşir

**Answer:** Aynı dosya kümesini paylaşırlar, düzenlemeler ve test çalıştırmaları birbirini bozar. Bir çalışma klasörü tek bir durumu tutar. İki ajan onu aynı anda değiştirir ve her birinin testi öbürünün yarım işini görür.


## Doğru yerden başlamak

Yeni dalın nereden başlayacağı bir ayar: `worktree.baseRef`. Varsayılan `"fresh"`, uzak reponun varsayılan dalından açıyor. `"head"` yaparsanız worktree yerel HEAD'inizden başlıyor ve push etmediğiniz commit'ler de geliyor. Yeni iş henüz push etmediğiniz bir şeye dayanıyorsa `"head"` seçin.

Bir pull request üzerinde çalışmak için `claude --worktree "#1234"` o PR'ın head'inden dal açıyor.

Yeni bir worktree'de yalnızca izlenen dosyalar olur, yani `.env` yoktur ve hiçbir şey çalışmaz. Böyle dosyaları `.worktreeinclude` içine gitignore sözdizimiyle yazın, her yeni worktree'ye kopyalanırlar.

> **Git LFS işaretçi dosya olarak gelebilir**
Claude Code worktree oluştururken repoda tanımlı filter driver'ları atlıyor. Git LFS `--local` ile kurulduysa gerçek içerik yerine işaretçi dosyalar gelir. Worktree içinde `git lfs pull` çalıştırın.


## Çıkınca ne olur

Temizlik, ne yaptığınıza bağlı.

- İsimsiz ve temiz bir worktree, oturum bitince otomatik silinir.
- İsimli olan size sorar.
- Değişiklik içeren, tutmak mı silmek mi istediğinizi sorar.

Var olan bir ismi yeniden açarsanız iki şeyden biri olur. Worktree temizse ve commit yoksa varsayılan dala sıfırlanır. Aksi halde eski ucundan devam eder. Yani isim sadece etiket değil, yarım kalmış işe dönüş yolu.

Claude kendisi de geçiş yapabiliyor: `EnterWorktree` ve `ExitWorktree` araçları oturum ortasında geçişe izin veriyor. Düzenli çalışan bir temizlik, `cleanupPeriodDays` süresinden eski alt ajan ve arka plan worktree'lerini, içinde iş yoksa siliyor.

## İzolasyonun sınırı

Claude Code, ana checkout'u gösteren düzenlemeleri, çalışma klasörlerini ve git yönlendirmelerini (`git -C`, `GIT_DIR`) engelliyor. Bu kazaları kapatıyor ama her yolu değil: ana checkout'a düz bir `cp` engellenmiyor. İzolasyon sizi hatalardan korur. Ajanın yaptığını gözden geçirmenin yerine geçmez.

Gözden kaçması kolay iki ayrıntı var.

- Worktree içinde verdiğiniz "bir daha sorma" onayı ana checkout'un `.claude/settings.local.json` dosyasına yazılır, yani yalnızca o worktree'de değil her yerde geçerli olur.
- `--fork-session`, ilk oturumun worktree'sinde değil, komutu başlattığınız klasörde başlar.

> **Yalnızca git değil**
Git dışında bu işi `WorktreeCreate` ve `WorktreeRemove` hook'ları yapıyor: hook klasörün yolunu yazdırıyor. Aynı hook'lar `/batch`'in git olmayan bir repoda çalışmasını da sağlıyor.


> **İkisini birden çalıştırın**
Bir repoda iki terminal açın. Birinde `claude -w one`, ötekinde `claude -w two` başlatın ve her birine farklı küçük bir iş verin. Sonra `git branch` çıktısına bakın ve birleştirmeden önce iki dalı karşılaştırın.


**Question:** Yeni işin dayandığı, push edilmemiş commit'leriniz var. Worktree'nin bunları içermesini hangi ayar sağlar?

- worktree.baseRef değerini "head" yapmak
- worktree.baseRef değerini "fresh" yapmak
- Commit'leri .worktreeinclude'a eklemek
- --fork-session kullanmak

**Answer:** worktree.baseRef değerini "head" yapmak. "fresh" uzak varsayılan daldan açar. "head" yerel HEAD'inizden açar, bu yüzden push edilmemiş işler de gelir.
