Sorun
Git'te çalışırken en büyük sıkıntılardan biri, mevcut çalışma dizininizde kaydedilmemiş değişiklikler varken başka bir dala geçmek istemenizdir. Bu durumda:
- Değişiklikleri stash edersiniz
- Dala geçersiniz
- Değişiklikleri yaparsınız
- Tekrar eski dala geri dönersiniz
- Stash'i geri yüklersiniz
git worktree, aynı Git deposuna ait farklı dizinlerde aynı anda birden fazla dalda çalışmanızı sağlar.
Çözüm: Git Worktree Nedir ve Nasıl Çalışır?
Git worktree, bir Git deposuna ait birden fazla çalışma dizini oluşturmanızı sağlayan güçlü bir komuttur. Normal bir Git deposunda sadece bir çalışma dizini bulunurken (dosyaları düzenlediğiniz dizin), worktree kullanarak aynı depoya ait farklı dizinlerde çalışabilirsiniz.
Her bir worktree'in aşağıdaki bileşenleri bulunur:
- Kendi çalışma dizini: Farklı bir dizinde bulunan dosyalar
- Kendi index'i: Dosya değişikliklerinin geçici olarak saklandığı alan
- Kendi HEAD' i: Hangi dalın aktif olduğunu gösterir
Ancak tüm worktreeler aynı nesne deposunu (object store) ve Git geçmişini paylaşırlar. Bu, her bir worktree için ayrı bir depo klonuna ihtiyacınız olmadığı anlamına gelir. Sadece aynı depoya ait farklı çalışma alanları oluşturursunuz.
Worktree'in Avantajları
- Dalları değiştirmek için stash gereksinimini ortadan kaldırır
- Farklı dallarda paralel olarak çalışmanızı sağlar
- Test ve geliştirme süreçlerini hızlandırır
- Kaynakların daha verimli kullanılmasını sağlar (ayrı bir depo klonuna ihtiyaç yoktur)
- Geçici test dizinleri oluşturmanızı kolaylaştırır
Temel Komutlar ve Kullanım
Worktree Oluşturma
Mevcut bir dal için worktree oluşturma:
git worktree add [seçenekler] <yol> [<commit-ish>]
Yeni bir dal oluşturma ve aynı anda check out etme:
git worktree add -b <yeni-dal-ismi> <yol> <temel-dal>
Detached worktree oluşturma (geçici testler için):
git worktree add --detach <yol> <dal>
Örnekler:
- Mevcut bir dal için worktree oluşturma:
# Ana çalışma dizini: /home/kullanici/proje # main dalında ayrı bir dizin oluşturma git worktree add ../proje-main mainBu komut,
../proje-maindizinindemaindalını check out ederken, ana çalışma dizini aynı kalır. - Yeni bir dal oluşturma ve worktree'e atama:
# Ana çalışma dizini: /home/kullanici/proje # Sıcak düzeltme (hotfix) dalı oluşturma git worktree add -b hotfix/odeme-hatasi ../proje-hotfix mainBu komut,
maindalından yeni birhotfix/odeme-hatasidalı oluşturur ve../proje-hotfixdizininde check out eder. - Detached worktree oluşturma:
# Geçici testler için detached worktree git worktree add --detach ../proje-test mainBu komut,
maindalının geçici bir kopyasını oluşturur ve herhangi bir dalda çalışmaz.
Mevcut Worktreeler'i Listeleme
git worktree list
Örnek çıktı:
/home/kullanici/proje abc1234 [develop]
/home/kullanici/proje-main def5678 [main]
/home/kullanici/proje-hotfix ghi9012 [hotfix/odeme-hatasi]
/home/kullanici/proje-test jkl3456 (detached)
Listede ilk satır her zaman ana çalışma dizinini gösterir. Diğer satırlar bağlı worktreeler'in yolunu, mevcut commit'ini ve check out edilen dalını gösterir.
Worktree Kaldırma
Temiz bir worktree'i kaldırma:
git worktree remove <worktree-yolu>
Örnek:
git worktree remove ../proje-hotfix
Uyarı: Worktree kaldırılmadan önce git -C <yol> status komutuyla değişikliklerin olup olmadığı kontrol edilmelidir. Değişiklikler varsa ya commit edilmeli ya da yedeklenmelidir.
Değişiklikler varsa zorla kaldırma:
git worktree remove --force <worktree-yolu>
Dikkat: --force seçeneği, değişiklikler varsa bile worktree dizinini siler. Önemli dosyalarınızı kaybetmemek için dikkatli kullanın.
Worktree'i Kilitleme ve Kilidini Açma
Worktree'i kilitleme (geçici olarak koruma):
git worktree lock --reason "harici diskte" <worktree-yolu>
Örnek:
git worktree lock --reason "harici diskte depolanıyor" ../proje-hotfix
Kilidi açma:
git worktree unlock <worktree-yolu>
Kilitlemenin faydaları:
- Worktree'in geçici olarak erişilemez olduğu durumlarda
prunekomutuyla silinmesini engeller - Worktree'in
removekomutuyla zorla silinmesini engeller - Kilitleme nedeni belirtilebilir (örneğin "harici diskte depolanıyor")
Stale Worktree Referanslarını Temizleme
Manually silinmiş bir worktree'in referansını temizleme:
# Önce dry-run ile temizlenecekleri görüntüleyin
git worktree prune --dry-run --verbose
# Sonra temizleme işlemini gerçekleştirin
git worktree prune --verbose
Not: Bu komut, aktif worktree dizinlerini değil, sadece metadata kayıtlarını temizler. git gc komutu da gc.worktreePruneExpire ayarına göre (varsayılan 3 ay) eski worktree kayıtlarını temizler.
Worktree'i Taşıma ve Onarma
Worktree dizinini manuel olarak taşıdıktan sonra bağlantıyı onarma:
git worktree repair <yeni-yol>
Örnek:
# Eski yol: /home/kullanici/eskiproje
git worktree repair /home/kullanici/yeni-proje
Not: Bu komut, worktree dizinini tekrar bağlar ancak yeniden check out etmez.
Pratik Kullanım Senaryoları
1. Hotfix Süreci
- Mevcut çalışma dizininde feature dalında çalışıyorsunuz
- Üretimdeki bir hatayı düzeltmeniz gerekiyor
# main dalında yeni bir worktree oluşturun git worktree add -b hotfix/uretim-hatasi ../proje-hotfix main - Worktree dizinine geçin ve hatayı düzeltin
cd ../proje-hotfix # Dosyaları düzenleyin ve testleri çalıştırın - Değişiklikleri commit edin ve pushlayın
git add . git commit -m "Üretimdeki ödeme hatasını düzelt" git push -u origin hotfix/uretim-hatasi - İşiniz bittiğinde worktree'i kaldırın
git worktree remove ../proje-hotfix
Avantaj: Ana çalışma dizini feature dalında kalır ve süreci kesintiye uğratmaz.
2. Paralel Testler
İki farklı dalda aynı anda testleri çalıştırma:
# main dalında detached worktree oluşturun
git worktree add --detach ../proje-test-1 main
# feature dalında testleri çalıştırın
git worktree add --detach ../proje-test-2 feature/new-feature
# Her iki dizinde de bağımsız olarak testleri çalıştırın
(cd ../proje-test-1 && npm test) &
(cd ../proje-test-2 && npm test) &
wait
Avantaj: Her iki dizin de bağımsız çalışırken aynı nesne deposunu paylaşırlar. Bu, bellek ve disk kullanımını optimize eder.
3. Geçici Deneyler
Bir dalda değişiklik yapmadan önce farklı bir yaklaşımı deneme:
# main dalında geçici bir worktree oluşturun
git worktree add --detach ../proje-deneme main
# Deneyleri yapın
cd ../proje-deneme
# ... deneyler ...
# Bittiğinde worktree'i silin
git worktree remove ../proje-deneme
Avantaj: Ana çalışma dizinindeki değişiklikler etkilenmez ve deneyler kolayca silinebilir.
Sık Karşılaşılan Sorunlar ve Çözümleri
1. "Dallardan biri zaten başka bir worktree'de check out edilmiş"
Sorun: Aynı dalı sadece bir worktree'de check out edebilirsiniz. Bir dal zaten başka bir worktree'deyse, hata alırsınız.
Çözüm: Yeni bir dal oluşturun ve bu dalı worktree'e atayın:
git worktree add -b yeni-dal-ismi <yol> <varolan-dal>
Veya detached worktree kullanın:
git worktree add --detach <yol> <dal>
2. "Worktree dizini bulunamadı"
Sorun: Worktree dizinini manuel olarak taşıdığınızda Git onu bulamaz.
Çözüm: Bağlantıyı onarın:
git worktree repair <yeni-yol>
3. "Worktree locked, silinemez"
Sorun: Worktree kilitliyse normal yöntemlerle silinemez.
Çözüm: Önce kilidi açın:
git worktree unlock <yol>
Veya zorla silmek için:
git worktree remove --force --force <yol>
İpuçları ve En İyi Uygulamalar
Worktree dizinlerini organize edin: Ana proje dizinine yakın ve anlaşılır isimler kullanın (örneğin
../proje-feature-x,../proje-hotfix-y).
Worktree'leri adlandırırken tutarlı olun: Proje adını ve dal ismini birleştirin (örneğin
proje-feature-x,proje-main).
Geçici worktreeler için detached mod kullanın: Sadece test amaçlı kullanacağınız worktreeler için detached mod tercih edin. Bu, dal karmaşasını önler.
Worktree'leri kilitleyin: Harici disklerde veya geçici olarak erişilemeyen konumlarda bulunan worktreeler için kilit kullanın.
Worktree'leri düzenli olarak temizleyin: Kullanmadığınız worktreeler'i
git worktree prunekomutuyla temizleyin.
Özet ve Sonuç
git worktree, Git kullanıcıları için oldukça güçlü ve verimliliği artıran bir özelliktir. Aynı depoda birden fazla dalda çalışmanızı sağlayarak:
- Dalları değiştirmek için stash yapma gereksinimini ortadan kaldırır
- Paralel çalışma ve test süreçlerini hızlandırır
- Kaynakların daha verimli kullanılmasını sağlar
- Geçici deneyler ve hotfix'ler için ideal bir çözümdür
Worktree kullanmaya başladığınızda, Git'teki dal yönetimi süreçleriniz daha akıcı ve esnek hale gelecektir. Bu rehberde öğrendiğiniz komutları ve teknikleri uygulayarak, geliştirme sürecinizi optimize edebilirsiniz.
Daha fazla bilgi için:



