Git Worktree Nasıl Çalışır
Bir özelliğin yarısındasınız, birkaç dosyada değişiklik var ve biri sizden main üzerindeki bir hatayı hemen düzeltmenizi istiyor. Alışılmış seçenekler zahmetli: yarım kalmış işi commit etmek ya da stash'leyip geri getirmeyi unutmamayı ummak. Git'in üçüncü bir seçeneği var: aynı depodan, başka bir branch'te ikinci bir klasör.
Bir Git projesinin iki parçası vardır. Gizli .git klasörü olan depo, her commit'i ve her branch'i saklar. working tree ise gerçekten düzenlediğiniz dosyaların bulunduğu, tek bir branch üzerinden çıkarılmış klasördür. Normalde tam olarak bir working tree vardır. git worktree komutu aynı depoya bunlardan daha fazlasını ekler. Hata düzeltmesini adım adım izleyin.
~/code/my-app $ git status --short M src/profile.ts- main2b7f1e0 Add login
- feature5e8a3c2 Start profile page
- hotfix—
Örnek komutlar ve çıktılar. Commit hash'leri uydurmadır.
Yeni klasör, kendi dosyaları ve kendi staging alanıyla kendi branch'inin eksiksiz bir kopyasıdır. Ama geçmişin kendine ait bir kopyasını almaz. İçindeki .git bir klasör değil, asıl depoyu gösteren küçük bir metin dosyasıdır. Worktree eklemenin yeniden klonlamaktan çok daha hızlı olmasının ve bir klasörde yapılan commit'in diğerinde hemen görünmesinin nedeni budur.
Tek bir kural var: Bir branch aynı anda yalnızca bir worktree'de açık olabilir. İki klasör aynı branch'te olsaydı, birindeki commit branch'i diğerinin ayağının altından kaydırır ve onun dosyaları artık branch'le uyuşmazdı. Kuralı çiğnemeyi deneyin.
~/code/my-app $ Hata mesajının tam metni Git sürümünüze göre değişir; eski sürümler branch'in diğer klasörde "is already checked out at" olduğunu söyler. Commit edilmemiş değişiklikler de geçişi engelleyebilir; bu demo bunu dışarıda bırakıyor.
Git düpedüz reddeder. Aynı koda gerçekten iki yerde ihtiyacınız varsa, örneğin iki build'i karşılaştırmak için, ikinci klasör için yeni bir branch açın ya da --detach seçeneğiyle commit'i branch olmadan açın.
Peki klasörler arasında tam olarak ne paylaşılır, ne her birine aittir? Her madde için bir tahminde bulunun.
- Commit'ler
- Branch'ler
- Hangi branch'in açık olduğu
- Stage'e alınmış değişiklikler
- Commit edilmemiş düzenlemeler
- node_modules ve .env gibi yok sayılan dosyalar
- Stash'ler
- origin/main gibi fetch edilmiş uzak branch'ler
.git/config içindeki ayarlar da varsayılan olarak paylaşılır; Git bazı ayarları worktree başına tutacak şekilde ayarlanabilir.
İnsanları en çok şaşırtan cevap şu: Git'in yok saydığı node_modules ya da .env gibi dosyalar yeni klasörde yoktur. Her yeni worktree'de bağımlılıkları yeniden kurmanız ya da ayarları yeniden kopyalamanız gerekebilir.
İşiniz bitince git worktree remove klasörü siler. Klasörde hala değişiklik varsa Git bunu reddeder, böylece yanlışlıkla iş kaybetmezsiniz. Klasörü elle silerseniz git worktree prune, Git'in onunla ilgili hala hatırladıklarını temizler; git worktree list de bütün worktree'lerinizi gösterir.
git worktree add ../my-app-hotfix -b hotfix main
git worktree list
git worktree remove ../my-app-hotfix
git worktree pruneWorktree'ler yeni bir nedenle yeniden popüler oldu: yapay zeka kodlama agent'ları. Birçok agent aracı her göreve kendi worktree'sini ve branch'ini verir; böylece birkaç agent birbirinin dosyalarını düzenlemeden aynı anda çalışabilir, bütün commit'leri de aynı depoya düşer.
Son bir şey: Worktree bir klon değildir. Klon, bütün geçmişi kendi branch'leri olan yeni ve ayrı bir depoya kopyalar. Worktree ise zaten sahip olduğunuz depoya bağlanmış bir klasörden ibarettir.
Bu içerik size yardımcı olduysa bana bir kahve ısmarlayabilirsiniz.
yapay zeka, yazılım ve tasarım üzerine etkileşimli yazı ve kurslardan haberdar olmak için bültene katılabilirsiniz. Ayda en fazla birkaç e-posta alırsınız.
800’den fazla meraklı okura sen de katıl.