git worktree: aynı anda birden fazla branch üzerinde nasıl çalışırsınız
git worktree, tek bir repository'ye birden çok çalışma dizini bağlamanıza izin verir; her dizinde ayrı bir branch açık olur. git worktree add ../hotfix main komutu, main branch'iyle projenin yanında bir klasör oluşturur; geçmiş ve nesneler ortaktır, yeniden klonlama gerekmez.
git worktree ne yapar
git worktree, tek bir repository'ye birden çok çalışma dizini bağlar. Ana klasörde özellik branch'i açık olabilir, yan klasörde ise acil bir hotfix için main açık olur; ikisi aynı anda var olur. Nesneler, commit'ler ve branch'ler ortaktır: bir klasörde yapılan commit, push ve fetch olmadan öbüründe hemen görünür.
Worktree olmadan bağlam değiştirmek şöyle olur: git stash, git switch main, düzeltme, geri git switch, git stash pop. Projede uzun süren bir derleme ya da ağır bir node_modules varsa, her branch geçişi önbellekleri de geçersiz kılar. İkinci yol, repository'yi baştan klonlamaktır; ama o zaman birbirinden bağımsız iki geçmiş kopyanız olur ve bunları uzak sunucu üzerinden eşitlemeniz gerekir.
Worktree ikisinin en iyisini sunar: ayrı klasörler, ama tek bir .git veritabanı. Bu mümkündür, çünkü Git'te branch bir dosya kopyası değil, bir commit'e işaretçidir ve farklı çalışma kopyalarının farklı işaretçilere bakmasına engel yoktur.
Ek bir çalışma kopyası nasıl oluşturulur
Temel biçim: git worktree add <yol> [<branch>]. Başlıca seçeneklere bakalım.
Var olan bir branch'i açmak
cd ~/projects/shop
git worktree add ../shop-main main
Preparing worktree (checking out 'main')
HEAD is now at 3f2c1ab README güncellendi
Projenin yanında shop-main adlı, main branch'i olan bir klasör oluşur. Oraya normal cd ile geçip herhangi bir repository'deymiş gibi çalışın.
Yeni bir branch'i çalışma kopyasıyla birlikte oluşturmak
git worktree add -b hotfix/payment-timeout ../shop-hotfix main
-b bayrağı, main'den hotfix/payment-timeout branch'i oluşturur ve onu yeni klasörde açar. -B aynısını yapar, ama branch zaten varsa onu belirtilen commit'e sıfırlar — dikkatli kullanın.
Kısa biçim
git worktree add ../experiment
Branch belirtmezseniz Git, yol adının son parçasıyla (burada experiment) mevcut HEAD'den yeni bir branch oluşturur. Aynı adla bir branch zaten varsa, o açılır.
Branch'siz çalışma kopyası
git worktree add --detach ../shop-v1.4 v1.4.0
detached HEAD modu, bir etiketle işaretli eski sürümü gereksiz branch oluşturmadan derleyip kontrol etmek için uygundur.
Uzak sunucudaki bir branch
git fetch origin
git worktree add ../review-auth feature/auth
Yerelde feature/auth yoksa ama tam olarak bir uzak origin/feature/auth varsa, Git izlemeli yerel bir branch oluşturur — tıpkı git switch feature/auth gibi. Bu, kendi işinize dokunmadan bir başkasının pull request'ini incelemek için pratiktir.
Çalışma kopyalarını listeleme ve silme
git worktree list
/home/anna/projects/shop a1b2c3d [feature/cart]
/home/anna/projects/shop-hotfix 7e8f9a0 [hotfix/payment-timeout]
/home/anna/projects/shop-v1.4 5d6e7f8 (detached HEAD)
İlk satır ana çalışma kopyasıdır (main worktree), diğerleri bağlı (linked) kopyalardır. Betikler için makine tarafından okunabilir çıktı git worktree list --porcelain ile alınır.
Hotfix birleştirildikten sonra çalışma kopyasını silin:
git worktree remove ../shop-hotfix
git branch -d hotfix/payment-timeout
git worktree remove, klasörü ve servis kayıtlarını siler. Kopyada commit edilmemiş değişiklikler ya da izlenmeyen dosyalar varsa komut çalışmayı reddeder; yalnızca bunların gerekli olmadığından emin olduğunuzda --force ekleyin. Dikkat: branch bu sırada silinmez, onu ayrıca silmeniz gerekir.
Klasörü elle sildiyseniz
Klasörü dosya yöneticisiyle ya da rm -rf ile silmek, .git/worktrees içinde yetim bir kayıt bırakır ve branch hâlâ meşgul sayılır. Bu kayıtları temizleyin:
git worktree prune --verbose
Git bunu çöp toplama sırasında periyodik olarak kendisi de yapar, ama beklemeniz gerekmez.
Bu nasıl çalışır
Bağlı bir çalışma kopyasında .git klasörü yerine, tek satırlık bir .git dosyası bulunur:
gitdir: /home/anna/projects/shop/.git/worktrees/shop-hotfix
Bu servis klasöründe çalışma kopyasına özgü veriler tutulur: kendi HEAD'i, kendi indeksi (staging area) ve devam eden merge ya da rebase durumları. Geri kalan her şey ortaktır: nesneler, branch'ler, etiketler, uzak depolar, yapılandırma ve hook'lar.
| Her kopyanın kendisi | Tüm kopyalar ortak |
|---|---|
| HEAD (mevcut branch ya da commit) | Nesneler ve tüm geçmiş |
| İndeks (git add) | Yerel ve uzak branch'ler, etiketler |
| Yarım kalmış merge, rebase, cherry-pick | Stash (refs/stash ortaktır) |
| Çalışma dizinindeki dosyalar | .git/config ve hook'lar |
Tablodan bir inceliğe varılır: herhangi bir kopyada git stash list aynı kayıtları gösterir. Bu, bir klasörde değişiklikleri saklayıp başka bir klasörde geri almak için bile kullanışlıdır.
Temel kısıt: bir branch, bir çalışma kopyası
Aynı branch'i iki çalışma kopyasında açamazsınız. Denerseniz Git şuna benzer bir hata verir:
git worktree add ../shop-copy feature/cart
fatal: 'feature/cart' is already used by worktree at '/home/anna/projects/shop'
(Eski Git sürümlerinde metin «is already checked out at» biçimindedir.) Bu kısıt, bir klasördeki commit'in sessizce öbür klasörün altındaki branch'i değiştirmesini önler. Çözümler: aynı commit'ten yeni bir branch oluşturmak (-b), kopyayı --detach modunda açmak ya da gerçekten gerekiyorsa sonuçlarını bilerek --force kullanmak.
Aynı nedenle, ana klasörde main başka bir çalışma kopyasında açıksa, orada git switch main çalıştıramazsınız.
Pratik senaryolar
Özellik ortasında acil hotfix
git worktree add -b hotfix/null-price ../shop-hotfix main
cd ../shop-hotfix
# düzelt, test et
git commit -am "Boş fiyatta çöküşü düzelt"
git push -u origin hotfix/null-price
cd ../shop
git worktree remove ../shop-hotfix
Yarım kalan özelliğiniz olduğu gibi kaldı, hiçbir şeyi stash'e almanız gerekmedi ve IDE'niz açık projedeki geçişi fark etmedi bile.
Çalıştırarak pull request incelemek
İnceleme için ayrı bir kopya, bir başkasının branch'ini derlemenize, testleri çalıştırmanıza ve bu sırada kendi işinize yan pencerede devam etmenize izin verir.
İki sürümün davranışını karşılaştırmak
Farklı etiketlerdeki iki kopyayı farklı portlarda paralel çalıştırıp, örneğin optimizasyon öncesi ve sonrası API yanıt süresini karşılaştırabilirsiniz.
Uzun testler ve derlemeler
Bir kopyada tam test takımını çalıştırırken öbüründe kod yazmaya devam edebilirsiniz; dosyaları değiştirdiğiniz için derleme bozulmaz.
Birden çok AI ajanının paralel çalışması
Birkaç ajan ya da süreç aynı işler üzerinde çalışıyorsa, her birine kendi branch'inde ayrı bir çalışma kopyası vermek uygundur: birbirlerinin işini bozmazlar ve sonuçlar aynı repository'ye düşer.
Sürekli worktree kullanıyorsanız klasörleri nasıl düzenlersiniz
Çalışma kopyalarına her gün ihtiyacınız varsa, bir yapı üzerinde anlaşın; yoksa komşu klasörler kısa sürede çöplüğe döner. Yaygın bir düzen: proje için tek bir ana klasör; içinde bare repository ve her branch için bir klasör:
git clone --bare git@example.com:team/shop.git ~/projects/shop/.bare
cd ~/projects/shop
echo "gitdir: ./.bare" > .git
git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch origin
git worktree add main
git worktree add -b feature/cart feature-cart main
remote.origin.fetch satırı gereklidir, çünkü bare klon uzak branch izlemeyi varsayılan olarak ayarlamaz. Sonuçta ~/projects/shop içinde main ve feature-cart klasörleri bulunur; her biri kendi branch'ine sahiptir ve hiçbiri diğerinden «ana» değildir.
İkinci iyi alışkanlık, klasöre branch ile aynı adı vermektir (eğik çizgiyi tire ile değiştirerek). Böylece git worktree list çıktısından ve terminaldeki yoldan nerede olduğunuz her zaman anlaşılır. Son olarak, branch birleştirildikten hemen sonra çalışma kopyasını silin: eski kopyalar yer kaplar ve branch'leri «meşgul» tutar.
Sık yapılan hatalar ve tuzaklar
- Bağımlılıklar ve derleme ortak değildir. Her kopya ayrı bir klasördür;
node_modules, Python sanal ortamı,.envve derleme çıktıları yeniden oluşturulmalıdır. İzlenmeyen dosyalar yeni kopyaya taşınmaz. - Çalışma kopyası ana klasörün içinde.
git worktree add ./hotfixproje içinde bir klasör oluşturur ve ana kopya bunu izlenmeyen dosya olarak görür. Kopyaları yan yana (../) tutun ya da ayrı bir dizinde saklayın; alternatif olarak yolu.gitignore'a ekleyin. - Klasörü elle taşımak. Bağlantı kopar. Taşımayı
git worktree move ../eski ../yeniile yapın; zaten taşıdıysanız yeni klasördegit worktree repairçalıştırın. - Harici diskteki kopya kaybolur. Disk takılı değilken prune'un kaydı silmemesi için kopyayı kilitleyin:
git worktree lock --reason "harici disk" ../shop-usb. - Alt modüller. Çalışma kopyalarında submodule desteği sınırlıdır; kopya oluşturduktan sonra
git submodule update --initçalıştırın ve sonucu kontrol edin.
git worktree komutları özeti
| Görev | Komut |
|---|---|
| Var olan branch'i yeni klasörde açmak | git worktree add ../dir branch |
| Branch ve kopya oluşturmak | git worktree add -b yeni-branch ../dir main |
| Branch'siz kopya (etiket, commit) | git worktree add --detach ../dir v1.0 |
| Kopyaları listelemek | git worktree list |
| Kopyayı silmek | git worktree remove ../dir |
| Silinmiş klasörlerin kayıtlarını temizlemek | git worktree prune |
| Kopyayı taşımak | git worktree move ../dir ../yeni-dir |
| Taşıma sonrası bağlantıları onarmak | git worktree repair |
| Prune'dan korumak | git worktree lock ../dir |
git worktree, stash ya da ikinci bir clone
| Ölçüt | stash | worktree | ikinci clone |
|---|---|---|---|
| Geçiş hızı | Hızlı, ama branch değişir | Anlık — yalnızca başka bir klasör | Anlık |
| Disk alanı | Minimum | Yalnızca çalışma dosyaları | Tam geçmiş kopyası |
| Eşitleme | Gerekmez | Gerekmez, geçmiş ortak | push/fetch ile |
| Aynı anda çalışma | Hayır | Evet | Evet |
Stash, birkaç dakikalık kısa kesintiler için en iyi seçenek olmayı sürdürür. Daha uzun süren işler ya da aynı anda iki sürümü açık tutma ihtiyacı için worktree daha uygundur.
Kısaca
git worktree, birden çok branch ile aynı anda çalışmanın basit bir yoludur: add klasör oluşturur, list bunları gösterir, remove ve prune temizler. Geçmiş ortaktır, ama HEAD, indeks ve dosyalar her kopyada ayrıdır; aynı branch iki kopyada açılamaz. Branch'lerin nasıl çalıştığını ve geçişlerin neden bu kadar hafif olduğunu Git kursunda uygulamalı olarak anlatıyoruz.
Sık sorulan sorular
git worktree hangi Git sürümünden beri var?
Komut Git 2.5 ile geldi ve sonradan geliştirildi; remove ve move gibi komutlar daha sonra eklendi. Günümüzün tüm Git sürümlerinde bu anlatılan komutların hepsi bulunur.
Bir çalışma kopyasında commit yapıp diğerinde görebilir miyim?
Evet, geçmiş ortaktır. Commit her kopyada git log ile hemen görünür ve git merge ile push ve fetch olmadan birleştirilebilir.
IDE'ler birden çok çalışma kopyasını görür mü?
IDE için her kopya sıradan bir proje klasörüdür; her biri ayrı bir pencerede açılır. Birçok editör, yerleşik Git arayüzünde çalışma kopyalarının listesini de gösterir.
git worktree remove branch'i de siler mi?
Hayır, yalnızca klasörü ve servis kaydını siler. Branch'i git branch -d ile ayrıca silin.
git worktree bare repository ile çalışır mı?
Evet. Popüler bir düzen, bare klon tutup her branch için ondan çalışma kopyası oluşturmaktır; bu durumda dosyaların bulunduğu bir «ana» klasör hiç olmaz.
Bu konu “Sıfırdan Güvenilir Geliştiriciye Git” kursunda uygulamalı olarak ayrıntılı işleniyor.
Kursa git