Mert Özen Her Satırda Daha İleri
Yapay Zeka Claude Code — #09

Paralel Çalışma: Worktree'ler, Desktop, Cloud Session'ları ve Mobilden Takip

Mert Özen 15 Kas 2026 9 dk 3 görüntülenme
Paralel Çalışma: Worktree'ler, Desktop, Cloud Session'ları ve Mobilden Takip

Claude Code'da paralel iş için her session'ı claude --worktree ile kendi git worktree'sinde başlat; dosyalar ayrılır ama user-secrets, veritabanı ve port'lar ayrılmaz. Worktree temizliği, .worktreeinclude, paylaşılan onaylar ve hook'lar, Bookstore için worktree başına veritabanı; Desktop, VS Code ve JetBrains, cloud session'ları, --teleport, Remote Control ve mobil uygulama.

Sürüm notu: Bu yazı Claude Code 2.1.325'i (13 Kasım 2026) anlatır; worktree davranışı, Desktop, IDE eklentileri, cloud session'ları, Remote Control ve mobil uygulama 15 Kasım 2026'da code.claude.com/docs'taki Run parallel sessions with worktrees, Desktop application, Visual Studio Code (VS Code) ve JetBrains eklenti sayfaları, Use Claude Code in the cloud, Remote Control, Claude Code on mobile, Claude Code in Slack ve Run agents in parallel sayfalarından kontrol edilmiştir. Bu yazıda resmî belgelerden yararlanılmıştır. Örnek PowerShell script'i PowerShell 7.7 ile, claude komutunun yerine bir stub konularak çalıştırılmıştır.

Önce Tahmin Et

Emre, sitedeki serilerin ortak örnek uygulaması Bookstore'da (bir online kitapçı) aynı anda iki iş yürütmek istedi: sipariş listesini CSV (virgülle ayrılmış düz metin tablo formatı) olarak dışa aktaran bir endpoint ve Angular bağımlılıklarının güncellenmesi. İki terminal açtı, ikisinde de aynı klasörde claude çalıştırdı. Bir saat sonra Angular session'ının package-lock.json'ı değiştirdiği anda diğer session'ın npm test'i kırıldı. Ertesi gün iki session'ı claude --worktree ile ayırdı; dosyalar artık çakışmıyordu ama iki session'ın migration'ları aynı BookstoreDb'ye uygulandı.

Tahminin ne? Worktree'ler dosyaları ayırdığı hâlde veritabanı neden ortak kaldı? Ve bir worktree session'ında "Yes, and don't ask again" dediğin bir komut diğer worktree'de de sorulmadan çalışır mı? İlk cevap Bookstore bölümünde, ikincisi paylaşılanlar bölümünde.

Worktree ile Paralel Session

Git worktree aynı repo geçmişini paylaşan ama kendi dosyaları ve branch'i olan ayrı bir çalışma klasörü; temelini Git & GitHub serisinin yirmi dördüncü yazısında anlattık. Claude Code bunu tek bir flag'e indiriyor:

claude --worktree orders-csv-export
claude --worktree angular-deps
claude --worktree "#1234"

Her komut repo kökünde .claude/worktrees/<ad>/ altında bir worktree ve worktree-<ad> adında yeni bir branch açıp Claude'u orada başlatıyor; ad vermezsen Claude bir ad üretiyor. Üçüncü satır bir pull request'in head commit'ini origin'den çekip .claude/worktrees/pr-1234'te açıyor; # shell'de yorum başlattığı için tırnak şart. İnteraktif koşu workspace trust istiyor: klasörde daha önce claude çalıştırmadıysan önce bir kez çalıştırıp trust dialog'unu onaylaman gerekiyor.

Session'dan çıkarken Claude worktree'yi kontrol ediyor. Değişiklik yoksa adsız bir session'ın worktree'si ve branch'i siliniyor, adlandırılmış session için önce soruluyor. Değişiklik, untracked dosya ya da yeni commit varsa tutmak mı silmek mi diye soruyor; tutarsan Claude Code geri dönmek için claude --worktree <ad> --resume komutunu yazıyor. claude -p koşularında çıkış sorusu olmadığı için worktree temizlenmiyor; onları git worktree remove ile kendin siliyorsun. Belgelerin önerisiyle .claude/worktrees/'ı .gitignore'a ekledik, yoksa worktree içerikleri ana checkout'ta untracked dosya olarak görünüyor.

Varsayılan base "fresh": yeni worktree remote'taki varsayılan branch'ten, genellikle main'den açılıyor. Henüz push etmediğin commit'lerin üzerinden devam etmek istiyorsan ayarlarda worktree.baseRef'i "head" yap; branch adı vermek mümkün değil, belli bir branch için worktree'yi git ile kendin açıyorsun.

Worktree'ye Ne Gelir, Neler Paylaşılır?

Worktree temiz bir checkout: bin, obj, node_modules ve gitignored dosyalar yok. Her worktree'de dotnet restore ve web/bookstore-web'de npm ci gerekiyor, sekizinci yazıdaki MCP (Model Context Protocol; dış araç ve veri kaynaklarına bağlanma protokolü) paketleri için de npm install --prefix tools/mcp. Gitignored bir dosyanın her yeni worktree'ye kopyalanmasını istiyorsan repo kökündeki .worktreeinclude dosyasına .gitignore syntax'ı ile yazıyorsun; yalnız hem pattern'e uyan hem de gitignored olan dosyalar kopyalanıyor. Bookstore'da tek satır var:

CLAUDE.local.md

İkinci yazıdaki kişisel notlar böylece her worktree'ye geliyor. Secret'ları bu dosyaya ekleme alışkanlığına dikkat et: .env yazarsan her worktree'de bir kopya daha oluşuyor ve kopyaların her biri ayrıca korunmalı.

Worktree'ler bazı şeyleri ana checkout'la paylaşıyor. Repo'nun .git klasörü ortak. Tahmindeki ikinci sorunun cevabı da burada: belgelere göre worktree'de "Yes, and don't ask again" ile verdiğin Bash onayı ana checkout'un .claude/settings.local.json'ına yazılıyor ve repo'nun bütün worktree'lerinde geçerli oluyor. Ancak belgeler, Windows'ta ve Claude Code'un repo kökünü kullanmadığı diğer durumlarda bu kuralın o worktree'de kaldığını da not ediyor. Ana checkout'ta untracked olan .claude/skills, .claude/agents ve .claude/commands klasörleri de worktree'de kendi kopyaları yoksa oradan okunuyor.

Hook'larda bir fark var: Claude bir worktree'ye girdiğinde ${CLAUDE_PROJECT_DIR} session'ın başladığı kökte kalıyor, hook girdisindeki cwd ise worktree'yi gösteriyor. Yedinci yazıdaki script'leri bu yüzden file_path'in klasöründen ve cwd'den çalışacak biçimde yazdık; worktree'de de doğru repo'ya bakıyorlar. Worktree'deki session için Claude Code ayrıca izolasyon kontrolleri uyguluyor: ana checkout'taki bir yola yapılan Edit ve Write'ı, çalışma dizini ana checkout'a çıkan komutları ve git'i ana checkout'a yönlendiren Bash komutlarını reddediyor. Belgeler bu kontrollerin cp ya da shell redirect'i gibi git çalıştırmadan yazan komutları izlemediğini de açıkça söylüyor.

Bookstore: İki Worktree, İki Veritabanı

Tahmindeki ilk sorunun cevabı user-secrets'ta. ConnectionStrings:BookstoreDb repo'da değil, kullanıcı profilinde ve projenin UserSecretsId'sine bağlı duruyor. Worktree'ler aynı projeyi checkout ettiği için ikisi de aynı secret'ı, yani aynı veritabanını görüyor. ASP.NET Core'un varsayılan configuration sırasında ortam değişkenleri user-secrets'tan sonra okunuyor; her worktree terminaline kendi değişkenini vermek yeterli. tools/start-worktree.ps1:

# Claude Code'u kendi worktree'sinde, kendi veritabanı ve API port'uyla başlatır.
# Repo kökünden, her worktree için ayrı bir terminalde çalıştır:
#   ./tools/start-worktree.ps1 -Name orders-csv-export -ApiPort 5081
param(
    [Parameter(Mandatory = $true)] [string]$Name,
    [int]$ApiPort = 5081,
    [string]$Server = 'localhost'
)

$database = 'BookstoreDb_' + ($Name -replace '[^A-Za-z0-9]', '_')

# Ortam değişkenleri user-secrets'ı ezer; bu terminal kendi veritabanını kullanır.
$env:ConnectionStrings__BookstoreDb = "Server=$Server;Database=$database;Integrated Security=true;TrustServerCertificate=true"
$env:ASPNETCORE_URLS = "http://localhost:$ApiPort"

Write-Output "worktree: $Name  database: $database  api: $env:ASPNETCORE_URLS"
claude --worktree $Name

Script claude'u o terminalin ortamıyla başlatıyor; Claude'un Bash ya da PowerShell tool'uyla çalıştırdığı dotnet ef database update, dotnet run ve testler bu değişkenleri görüyor. İki terminalde farklı ad ve port verince:

./tools/start-worktree.ps1 -Name orders-csv-export -ApiPort 5081
./tools/start-worktree.ps1 -Name angular-deps -ApiPort 5082

İlk satır BookstoreDb_orders_csv_export veritabanını ve 5081 port'unu kullanıyor. Windows authentication kullanmıyorsan connection string'i kendi bağlantı bilgilerinle değiştir; şifreyi script'e yazma. Angular tarafında ng serve --port 4201 gibi ikinci bir port ver, yoksa iki dev server aynı port'u ister. Sekizinci yazıdaki Playwright server'ı http://localhost:4200'e izin verdiği için ikinci worktree'de UI testine ihtiyacın varsa orada da port'u güncellemen gerekiyor.

Altıncı yazıdaki isolation: worktree subagent'ları ve /batch da aynı mekanizmayı kullanıyor; onların worktree'leri değişiklik yoksa otomatik siliniyor, varsa cleanupPeriodDays süresi dolunca periyodik temizlikte, içinde iş kalmamışsa kaldırılıyor.

Desktop ve IDE Eklentileri

Claude Desktop uygulamasındaki Code sekmesi aynı motorun grafik arayüzü: CLAUDE.md, ayarlar ve MCP server'ları ortak. Windows için x64 ve ARM64 (ARM işlemciler için 64 bit mimari) kurulumları var. Kenar çubuğunda birden fazla session'ı paralel açabiliyor, iki session'ı yan yana görebiliyorsun. Git repo'sunda session başlatmadan önce Worktree seçeneğini açarsan session kendi worktree'sinde çalışıyor; varsayılan kapalı. Worktree konumu ve branch öneki ayarlardan değişiyor, .worktreeinclude burada da geçerli. Desktop worktree session'larında bir fark var: ayarlar, hook'lar, skill'ler ve .mcp.json ana checkout'un kökünden okunuyor, CLAUDE.md ve .claude/rules/ ise worktree'den. WSL (Windows Subsystem for Linux; Windows içindeki Linux ortamı) kullanan ekip için Desktop'ta WSL 2 dağıtımı içinde çalışan session'lar da var.

VS Code eklentisi önerilen yol: inline diff, planı onaylamadan düzenleme, seçili satırları @ ile verme ve ayrı sekmelerde birden fazla konuşma. JetBrains eklentisi IntelliJ ve WebStorm gibi IDE'lerde değişiklikleri IDE'nin diff görünümünde açıyor. Belgelerdeki desteklenen IDE listesi Rider'ı adıyla saymıyor; ekipte Rider kullanan varsa eklentiyi kurmadan önce JetBrains IDEs sayfasını kontrol etsin. IDE'lerdeki genel AI asistanları IDE'ler serisinin dokuzuncu yazısında.

Cloud Session'ları, Remote Control ve Mobil

Cloud session, senin makinen yerine bulut altyapısında çalışan bir Claude Code session'ı: laptop'ı kapatsan da devam ediyor ve Pro, Max, Ultra, Team planlarında, Enterprise'da da belirli koltuk türlerinde var. claude.ai/code'dan, mobil uygulamadan, Desktop'tan ya da terminalden başlatılabiliyor:

claude --cloud "Add a CSV export endpoint for orders in src/Bookstore.Api and its tests"
claude --teleport

--cloud yerel checkout'unu değil, bulunduğun branch'in GitHub'daki hâlini klonluyor; yerel commit'lerin varsa önce push et. --teleport bir cloud session'ını terminaline çekiyor: doğru repo'da olduğunu kontrol ediyor, branch'i checkout ediyor ve konuşmayı yüklüyor. Her session bir cloud environment'ta çalışıyor; ilk environment ağ erişimi Limited olan Default environment. Bookstore'un API testleri SQL Server istediği için cloud environment'ın kurulum script'i ve ağ ayarları bu açıdan ayrıca düşünülmeli. Cloud session'ları planının usage limit'lerinden düşüyor, VM için ayrı ücret yok.

Remote Control ise tersini yapıyor: session senin makinende çalışmaya devam ediyor, claude.ai/code ya da mobil uygulama yalnız bir pencere. Proje klasöründe claude remote-control ya da session içinde /remote-control ile başlıyor; yerel dosya sistemi, MCP server'ların ve ayarların aynen kullanılıyor, bu yüzden bilgisayarın açık kalmalı. API key ile çalışmıyor, claude.ai girişi istiyor ve Team ile Enterprise'da yöneticinin açması gerekiyor. Ayrı bir Claude Code mobil uygulaması yok; cloud session'ları ve Remote Control, Claude uygulamasının Code sekmesinde. Slack'te @Claude'a verilen kodlama işi de bir cloud session'ı başlatıyor; belgeler bu sürümün yalnız Pro, Max ve Ultra hesaplarına ve Claude Tag'e bağlı olmayan workspace'lere yanıt verdiğini yazıyor.

Terminalde birden fazla arka plan session'ını tek ekrandan izlemek için claude agents ile açılan agent view var; belgelere göre research preview aşamasında.

Üretimde Dikkat

Paralel session'lar ve subagent'lar token kullanımını katlıyor; her biri aynı plan limitinden düşüyor. Paralel iş sayısını review edebileceğin diff sayısıyla sınırla: üç worktree'de aynı anda biten üç büyük değişikliği dikkatle okuyamıyorsan paralellik kazanç değil.

Cloud session'larda kod Anthropic'in yönettiği izole bir VM'de çalışıyor; git kimlik bilgileri sandbox dışında tutuluyor ve bir proxy session adına kapsamı daraltılmış bir kimlikle işlem yapıyor. Ağ erişimi varsayılan sınırlı. Belgeler, ağ erişimi kapalıyken bile Claude Code'un Anthropic API'sine ulaşabildiğini ve bunun verinin VM'den çıkmasına imkân verebileceğini not ediyor; şirket politikanı bu bilgiyle değerlendir.

Remote Control açık bir session'a başka bir cihazdan komut gönderebilmek demek. Telefonunu kilitsiz bırakma, işin bitince session'ı kapat.

Sık Düşülen Tuzaklar

Aynı veritabanını ve port'u paylaşan worktree'ler. Dosyalar ayrı, user-secrets ve port'lar değil; her terminale kendi değişkenlerini ver.

Temizlenmeyen worktree'ler. -p koşuları ve tuttuğun worktree'ler diskte kalıyor; git worktree list ile ara sıra bak.

Aynı checkout'ta iki session. Worktree olmadan açılan iki session aynı dosyalara yazıyor; belgeler aynı session'ı iki terminalde açmanın transcript'te mesaj kaybına yol açabileceğini de söylüyor.

--cloud'un yerel commit'leri götürdüğünü sanmak. Cloud VM GitHub'daki branch'i klonluyor; push etmediğin iş orada yok.

Küçük Bir Deneme

★☆☆ claude --worktree deneme ile bir session aç, hiçbir şey değiştirmeden çık ve worktree ile branch'in silinip silinmediğini git worktree list ve git branch ile kontrol et.

★★☆ start-worktree.ps1 ile iki worktree aç, birinde migration ekleyip uygula ve diğerinin veritabanında bu tablonun olmadığını doğrula.

★★★ Bir PreToolUse hook'u yaz: worktree session'ında cwd ile CLAUDE_PROJECT_DIR farklıysa ve komut dotnet ef database update ise, ortamdaki connection string'de worktree adı yoksa çağrıyı reddetsin.

Şimdiye kadar Claude Code'u hep bir insan yönetiyordu. Onuncu yazıda claude -p ile Claude Code'u script'lerden ve CI'dan çalıştıracak, GitHub Actions'ta pull request review'u kuracak ve bu otomasyonun güven sınırlarını çizeceğiz.