· kaynak GitHub Blog
Git 2.56, güvenli çakışma aşamalama, daha hızlı merge-base aramaları ve sunucuya hazır path-walk repack'ler getiriyor
Git 2.56, alakasız değişiklikleri de içine çekmeden çakışma çözümlerini aşamalamak için git add --resolved komutunu tanıtıyor; ayrıca büyük merge-base hızlandırmaları ve bitmap uyumlu path-walk repack'ler geliyor.

Git projesi, GitHub Blog'a göre 104'ten fazla katkımcının, bunların 39'unun ilk kez katkıda bulunduğu çalışmalarla 2.56.0 sürümünü yayımladı. Sürümün öne çıkan değişiklikleri, çözülmüş merge çakışmalarını aşamalamanın daha güvenli bir yolu, önemli ölçüde daha hızlı bir merge-base algoritması ve path-walk repack'leri büyük barındırma altyapısında kullanılabilir kılan düzeltmeler.
Yalnızca çözdüklerinizi aşamalamak
Bir merge çakışmasını çözmek iki parçadan oluşur: her çakışan path doğru olana kadar çalışma ağacını düzenlemek, ardından çakışmayı çözülmüş olarak işaretlemek için bu path'leri aşamalamak. GitHub Blog'un açıkladığı gibi, mevcut komutlar fazlasını aşamalamayı kolaylaştırıyor. git add -u, değiştirilmiş her izlenen path'i günceller; bu da merge sırasında alakasız yerel düzenlemeleri içine çekebilir ve ayrıca gözden kaçırdığınız çakışma işaretlerini hâlâ içeren bir dosyayı aşamalayabilir.
Git 2.56, yalnızca indekste o anda birleşmemiş (unmerged) path'leri dikkate alan git add --resolved komutunu ekliyor. Herhangi bir şeyi aşamalamadan önce, kalan çakışma işaretleri için birleşmemiş normal dosyaları tarar; herhangi bir işaret bulursa, etkilenen path'leri listeler ve indeksi değiştirmeden bırakır. Bir pathspec, hangi birleşmemiş path'lerin dikkate alınacağını daraltabilir, ancak işaret denetimi bu seçim içinde ya hep ya hiçtür. Çözülmüş silmeler ve ikili (binary) çakışmalar metinsel işaret içermediğinden normal şekilde aşamalanır. Bu bayrak -u veya -A ile birleştirilemez ve hiçbir zaman çakışmamış izlenen dosyaları yok sayar.
Merge-base aramaları daha erken duruyor
Merge'ler, üç noktalı diff'ler ve depo barındırıcılarının pull request'ler için yaptığı birleştirilebilirlik ve karşılaştırma denetimleri, iki commit'in en iyi ortak atalarına ihtiyaç duyar. Git bunları iki uçtan geriye doğru yürüyerek ve hangi tarafın her commit'e ulaşabildiğini işaretleyerek bulur. Çapraz (criss-cross) merge'ler, hiçbiri diğerinin atası olmayan birden çok merge base üretebilir; bu yüzden Git, hepsini bulduğunu bilene kadar yürümeye devam etmek zorundadır.
Eski durma kuralı, başka bir merge base olanaksız hale geldikten sonra bayat paylaşılan geçmişin uzun bir kuyruğunu işlemeye devam edebiliyordu. Git 2.56 bunun yerine kuyruktaki commit'lerden kaç tanesinin yalnızca her bir tarafından erişilebilir kaldığını izliyor; münhasır bir taraf tükendiğinde yeni bir buluşma noktası ortaya çıkamaz, dolayısıyla Git her merge base'i döndürmeye devam ederken durabiliyor.
GitHub Blog'un bildirdiği kazanımlar büyük. Gerçek bir monorepo'da bir geçiş (traversal) 0.68 saniyeden 0.01 saniyeye düştü ve iki büyük monorepo üzerindeki üretim değerlendirmeleri, birinde yaklaşık 70 kat daha hızlı birçok vaka, diğerinde ortalama yaklaşık 20 kat iyileşme buldu. Uzun süredir süregelen bir Linux kernel vakası da iyileşti: varsayılan v2 commit-graph ile git merge-base --all v4.8 v4.9, 167.441 geçiş adımı ve 0.29 saniyeden 3.887 adım ve 0.01 saniyeye düştü.
Path-walk repack'ler sunucuya hazır hale geliyor
Repack yaparken Git geleneksel olarak delta adaylarını bir ad hash'i kullanarak gruplandırır. Path-walk repack ise nesneleri ağaçtaki konumlarına göre ziyaret eder, aynı path'in sürümlerini bir araya getirir ve genellikle çok daha iyi delta ilişkileri bulur. Deltaları yeniden hesaplanmış Fluent UI deposunun bir klonunu kullanan bir GitHub Blog karşılaştırmasında, sıradan bitmapped bir repack 558.5 MB'lık bir pack üretirken, path-walk repack 164.4 MB üretti — yaklaşık %71 daha küçük.
Şimdiye kadar path-walk repack, barındırıcıların nesne listeleme sorgularını hızlı yanıtlamak için kullandığı erişilebilirlik bitmap'leriyle ve delta islands ile uyumsuzdu. Git 2.56 her iki kısıtlamayı da kaldırıyor: bir path-walk repack, yeni bir bitmap için commit'leri seçebiliyor, sonraki git pack-objects çağrıları istek karşıladığında mevcut bir bitmap'i yeniden kullanabiliyor ve path-walk artık delta tabanları seçilmeden önce gereken island-üyeliği defter tutmasını yapıyor. Path-walk varsayılan olarak kapalı kalıyor, ancak barındırıcılar artık hızlı bitmap destekli sunumdan veya izolasyon kurallarından vazgeçmeden depolama kazançlarını değerlendirebiliyor.
git history ve git refs büyüyor
Git 2.54'te reword ve split ile tanıtılan ve 2.55'te fixup ile genişletilen deneysel git history komutu, bir commit'i kaldıran ve alt commit'lerini, alakasız yerel değişiklikleri koruyarak commit'in üst commit'i üzerine yeniden oynatan git history drop komutunu kazanıyor. Bir yeniden oynatma çakışma yaratacaksa veya yerel bir değişikliğin üzerine yazacaksa iptal olur; merge commit içeren geçmişlerde çalışamaz ve bir root ya da merge commit'i kaldıramaz.
Tarihsel olarak git update-ref, git symbolic-ref ve diğer alt düzey komutlara yayılmış olan düşük düzey referans yazımı, karşılaştır-ve-değiştir koruması sağlayan isteğe bağlı eski değer argümanları da içeren create, update, delete ve rename alt komutlarıyla git refs araç kutusunda birleşmeye devam ediyor. GitHub Blog'dan bir uyarı: git refs rename, ref'i ve reflog'unu taşır ancak git branch -m'in yaptığı branch yapılandırması ayarlamalarını yapmaz.
Neden önemli
Git neredeyse her geliştirme iş akışının altında yattığından, bu düzeydeki değişiklikler milyonlarca depo boyunca çoğalır. git add --resolved, rutin ama hataya açık bir adımı — çakışma işaretlerini veya alakasız değişiklikleri yanlışlıkla bir merge'e commit etmeyi — korunumlu bir işleme dönüştürüyor. Merge-base optimizasyonu, Git'in diff ve birleştirilebilirlik hesapladığı her yerde, barındırma platformlarındaki pull request denetimleri dahil, hissediliyor; kernel ve monorepo rakamları, uzun geçmişlerde farkın büyüklük mertebesine ulaşabileceğini gösteriyor. Bu arada path-walk repack'lerin bitmap'ler ve delta islands ile uyumlu hale getirilmesi, sunum performansından ödün vermeden barındırıcı ölçeğinde diskteki depoların çarpıcı biçimde küçülmesinin önünü açıyor. Git kadar olgun bir araç için 2.56, tek tek komutlardan sunucu tarafındaki pack'lemeye kadar her katmanda anlamlı çalışmaların hâlâ geldiğini gösteriyor.
- #git
- #version-control
- #open-source
- #developer-tools
- #performance
İlgili yazılar
- Cloudflare, SDK'lar, CLI'lar ve dokümantasyon üreten eklenebilir bir pipeline olan Forge'u açık kaynak yaptı
- GitHub'ın açık kaynak yapay zekâ güvenlik ajanı, OsmAnd izleme hatası dahil 24 Android açığı ortaya çıkardı
- Nvidia'nun Open Agent Safety Platform'u yapay zekâ ajanlarını yazılımla ve bir watchdog çipiyle sınırlıyor