Git Worktree: Birden Fazla Dal Üzerinde Eş Zamanlı Çalışma

Git'te dal değiştirirken karşılaşılan sorunları çözmek için worktree kullanımı. Worktree nedir, nasıl oluşturulur, yönetilir ve silinir detaylı anlatım.

I
ITWISE
1 görüntülenme
Git Worktree: Birden Fazla Dal Üzerinde Eş Zamanlı Çalışma

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
Böyle bir akış süreci kesintiye uğratır ve çatışmalara yol açabilir. 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:

  1. 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 main

    Bu komut, ../proje-main dizininde main dalını check out ederken, ana çalışma dizini aynı kalır.

  2. 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 main

    Bu komut, main dalından yeni bir hotfix/odeme-hatasi dalı oluşturur ve ../proje-hotfix dizininde check out eder.

  3. Detached worktree oluşturma:
    # Geçici testler için detached worktree
    git worktree add --detach ../proje-test main

    Bu komut, main dalı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 prune komutuyla silinmesini engeller
  • Worktree'in remove komutuyla 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

  1. Mevcut çalışma dizininde feature dalında çalışıyorsunuz
  2. Üretimdeki bir hatayı düzeltmeniz gerekiyor
    # main dalında yeni bir worktree oluşturun
    git worktree add -b hotfix/uretim-hatasi ../proje-hotfix main
  3. Worktree dizinine geçin ve hatayı düzeltin
    cd ../proje-hotfix
    # Dosyaları düzenleyin ve testleri çalıştırın
  4. 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
  5. İş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 prune komutuyla 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:

Kaynak

Linuxize