Git’in tek dal kuralı
Git’te bir çalışma klasörünün tek bir HEAD’i ve tek bir hazırlık alanı (index) var. Yani aynı anda tek bir dalda çalışıyorsun. Bir özelliğin yarısındayken acil bir hata gelirse bildik dans başlıyor: git stash, dal değiştir, düzelt, commit at, geri dön, git stash pop. Ya da iki işi aynı dala atıp sonra ayırmaya çalışıyorsun.
Bir yol daha var: Git worktree ile her dal için ayrı bir klasör açmak. Temiz ama bedeli var: Her klasörde bağımlılıkları yeniden kurmak, her biri için ayrı geliştirme sunucusu çalıştırmak gerekiyor.
Paralel dallar: Tek klasör, birden fazla dal
GitButler, Git’in üstüne kurulan bir masaüstü uygulaması ve but adında bir komut satırı aracı. Videonun gösterdiği ana fikir, eskiden “virtual branches” denen, belgelerde artık paralel dallar (parallel branches) diye geçen özellik.
Belgelere göre birkaç dal aynı çalışma klasörüne aynı anda uygulanabiliyor. Arayüzde her dal dikey bir şerit gibi duruyor ve her birinin kendi hazırlık alanı var. Bir dosyadaki değişikliği, hatta tek bir parçasını (hunk) sürükleyip istediğin dala atıyorsun. Sonra her dalı ayrı ayrı commit’leyip ayrı ayrı gönderiyorsun. Böylece hata düzeltmesi kendi PR’ında, özellik kendi PR’ında gidiyor. Ama ikisi de aynı klasörde, aynı geliştirme sunucusunda birlikte çalışıyor.
Arkada ne oluyor?
Git bu kavramı bilmiyor. GitButler bunu gitbutler/workspace adında bir dalla çözüyor. Bu dalın son commit’i, uyguladığın bütün dalların birleşimi (merge commit). GitButler onu sen dalları değiştirdikçe yeniden üretiyor. Böylece editörün ve diğer araçlar tek bir normal dal görüyor.
Belgelere göre git log, git status ve git diff gibi okuyan komutlar normal davranıyor. Yazan komutlarda, yani git commit ve git checkout’ta dikkatli olmalısın. GitButler, bu dala doğrudan commit atılmasını bir pre-commit kancasıyla engelliyor. Normal Git’e dönmek istersen but teardown yetiyor.
Bir sınır da var: Dallar aynı klasörü paylaştığı için birini ötekinden tamamen ayrı test edemiyorsun. İki dal aynı satırları değiştiriyorsa da işler karışıyor. Tamamen yalıtılmış çalışma istiyorsan worktree hâlâ daha uygun.
Geri alma ve ajanlar
GitButler durumu değiştiren her işlemi bir işlem günlüğüne yazıyor. Yanlış bir şey yaptığında but undo ile son adımı geri alabiliyor ya da istediğin bir kayıt noktasına dönebiliyorsun. Commit’leri bölmek, birleştirmek, başka dala taşımak da sürükle bırak ile yapılıyor.
Ajanlar için ayrı bir yol var. GitButler’ın blogunda anlatıldığına göre Claude Code’un kancaları (hooks), her dosya düzenlemesinde GitButler’a haber veriyor. GitButler her oturum için ayrı bir dal açıyor ve o oturumun değişikliklerini oraya koyuyor. Yani üç ajan aynı klasörde çalışsa bile sonunda üç ayrı dal çıkıyor. but komutlarına --json eklersen çıktı ajanların okuyabileceği biçimde geliyor.
Lisans konusunda bir not: GitButler “Fair Source” lisanslı. Kodu okuyup kullanabiliyorsun ama rakip bir ürün yapamıyorsun. README’ye göre her sürüm iki yıl sonra MIT’ye dönüşüyor.
Sonra ne oldu?
GitButler’ın öteki büyük özelliği üst üste dallar (stacked branches). Ağustosta GitHub da stacked PR’ları herkese açtı, yani bu çalışma şekli artık ana akım. GitButler’ın kurucu ortağı Scott Chacon ise eylül sonunda Git 3.0’ın SHA-256 kararını eleştiren yazısıyla gündeme geldi. Bunu Git 3 yazımızda anlattık.
Düşün
- Son haftada kaç kez
git stashyaptın? Bunların kaçı aslında ayrı bir dal olmalıydı? - Ajanların aynı klasörde mi yoksa ayrı kopyalarda mı çalışmasını tercih edersin? Neden?
Videoyu izle
Kaynaklar (6, İngilizce)
- Better Stack: Is This A Better Way to Use Git? (video) (yeni sekmede açılır)
- GitHub: gitbutlerapp/gitbutler (yeni sekmede açılır)
- GitButler Docs: Parallel branches (yeni sekmede açılır)
- GitButler Docs: The workspace branch (yeni sekmede açılır)
- GitButler Blog: Introducing the GitButler CLI (yeni sekmede açılır)
- GitButler Blog: Managing multiple Claude Code sessions without worktrees (yeni sekmede açılır)
Kendi cümlelerimizle yazılmış bir özettir, çeviri değildir. Tüm kaynaklar yukarıda.