Birleştirme (sürüm kontrolü) - Merge (version control)

Sürüm kontrollü bir projenin örnek geçmiş grafiği, kırmızı oklar olarak birleştirmeler

In sürüm kontrolü , birleştirme (diğer adıyla entegrasyon) dosyaların bir sürüm kontrollü koleksiyonuna yapılan birden fazla değişiklik uzlaştıran bir temel işlemdir. Çoğu zaman, bir dosya iki bağımsız dalda değiştirildiğinde ve ardından birleştirildiğinde gereklidir . Sonuç, her iki değişiklik grubunu içeren tek bir dosya koleksiyonudur.

Bazı durumlarda, değişiklikleri yeniden oluşturmak için yeterli geçmiş bilgisi bulunduğundan ve değişiklikler çakışmadığı için birleştirme otomatik olarak gerçekleştirilebilir . Diğer durumlarda, bir kişi ortaya çıkan dosyaların tam olarak ne içermesi gerektiğine karar vermelidir. Birçok revizyon kontrol yazılımı aracı, birleştirme yeteneklerini içerir.

Birleştirme türleri

İki tür birleştirme vardır: otomatik ve manuel.

Otomatik birleştirme

Otomatik birleştirme, aynı anda (mantıksal anlamda) meydana gelen değişiklikleri uzlaştırdığında sürüm kontrol yazılımının yaptığı şeydir. Ayrıca, aynı içeriği aynı anda düzenlemeye izin veriyorlarsa, diğer yazılım parçaları otomatik birleştirmeyi dağıtır. Örneğin, Wikipedia iki kişinin aynı makaleyi aynı anda düzenlemesine izin verir; ikinci katkıda bulunan kişi kaydettiğinde, önceki değişikliklerin üzerine yazmak yerine değişiklikleri makaleyle birleştirilir.

Manuel birleştirme

El ile birleştirme, insanların farklı dosyaları uzlaştırmaları gerektiğinde başvurmaları gereken şeydir (muhtemelen birleştirme araçlarıyla desteklenir). Örneğin, iki sistem bir yapılandırma dosyasının biraz farklı sürümlerine sahipse ve bir kullanıcı her ikisinde de iyi şeylere sahip olmak istiyorsa, bu genellikle yapılandırma dosyalarını elle birleştirerek ve her iki kaynaktan istenen değişiklikleri seçerek elde edilebilir (bu aynı zamanda iki yönlü birleştirme denir). Otomatik birleştirme bir değişiklik çakışmasına yol açtığında manuel birleştirme de gereklidir; örneğin, çok az sayıda otomatik birleştirme aracı, aynı kod satırındaki iki değişikliği birleştirebilir (örneğin, bir işlev adını değiştiren ve bir yorum ekleyen). Bu durumlarda, revizyon kontrol sistemleri, amaçlanan birleştirme sonucunu belirtmek için kullanıcıya başvurur.

Algoritmaları birleştir

Küçük farklarla otomatik birleştirmeye yönelik birçok farklı yaklaşım vardır. Daha dikkate değer birleştirme algoritmaları, üç yollu birleştirme, özyinelemeli üç yollu birleştirme, bulanık yama uygulaması, örgü birleştirme ve yama değiştirmeyi içerir.

Üç yollu birleştirme

Üç yollu birleştirme diyagramı
C başlangıç ​​noktasıdır, A ve B, C'nin türevleridir ve D yeni çıktı sürümüdür

Bir "A" dosyası ve bir "B" dosyası arasında otomatik bir fark analizinden sonra, aynı zamanda her iki "C" dosyasının kökenini veya ortak atasını da göz önünde bulundurarak üç yönlü bir birleştirme gerçekleştirilir. Bu kaba bir birleştirme yöntemidir, ancak birleştirilecek değişiklikleri yeniden yapılandırmak için yalnızca bir ortak ataya ihtiyaç duyduğundan yaygın olarak uygulanabilir.

Üç yönlü birleştirme, üç dosyadan yalnızca ikisinde aynı olan bölümleri arar. Bu durumda, bölümün iki sürümü vardır ve "C" ortak atasındaki sürüm atılır, farklı olan sürüm çıktıda korunur. "A" ve "B" aynı fikirdeyse, çıktıda görünen budur. "A" ve "C" de aynı olan bir bölüm, değiştirilen sürümü "B" olarak verir ve benzer şekilde "B" ve "C" için aynı olan bir bölüm, "A" için sürümü verir.

Her üç dosyada da farklı olan bölümler çakışma durumu olarak işaretlenir ve kullanıcının çözmesi için bırakılır.

Üç yollu birleştirme, her yerde bulunan diff3 programı tarafından uygulanmaktadır ve dosya kilitleme tabanlı revizyon kontrol sistemlerinden birleştirme tabanlı revizyon kontrol sistemlerine geçişe izin veren merkezi yenilikti. Eşzamanlı Sürümler Sistemi (CVS) tarafından yaygın olarak kullanılır .

Özyinelemeli üç yollu birleştirme

Üç yollu birleştirme tabanlı revizyon kontrol araçları yaygındır, ancak teknik temelde birleştirilecek sürümlerin ortak bir atasını bulmaya dayanır.

Tuhaf durumlar, özellikle de değiştirilmiş sürümlerin benzersiz bir son ortak atasının bulunmadığı "çapraz birleştirme" vardır.

Yazılım sürüm kontrolünde "Çapraz birleştirme" sorunu. Sol yarıda 2 alan değiştiriliyor ve . ve art arda değiştirilmiş versiyonlardır. Çözüm sağ yarıda gösterilir: sanal bir ata (kesikli daire) oluşturulur.

Neyse ki, bu durumda, en fazla iki olası aday ata olduğu gösterilebilir ve özyinelemeli üç yollu birleştirme , önce benzersiz olmayan ataları birleştirerek sanal bir ata oluşturur . Bu birleştirmenin kendisi de aynı sorunu yaşayabilir, bu nedenle algoritma bunları yinelemeli olarak birleştirir. Tarihte sınırlı sayıda sürüm olduğundan, sürecin sonunda sona ermesi garanti edilir. Bu teknik Git revizyon kontrol aracı tarafından kullanılır .

(Git'in özyinelemeli birleştirme uygulaması, bir sürümde değiştirilen ve diğerinde yeniden adlandırılan bir dosya gibi diğer garip durumları da ele alır, ancak bunlar üç yönlü birleştirme uygulamasının uzantılarıdır; birleştirilecek üç sürüm bulma tekniğinin bir parçası değildir.)

Özyinelemeli üç yollu birleştirme, yalnızca aracın birleştirilecek türevlerin toplam soy yönelimli asiklik grafiği (DAG) hakkında bilgi sahibi olduğu durumlarda kullanılabilir . Sonuç olarak, türevlerin veya birleşmelerin ana/ebeveynlerini tam olarak belirtmediği durumlarda kullanılamaz.

Bulanık yama uygulaması

Bir yama bir dosyaya değişikliklerin bir açıklamasını içeren bir dosyadır. Unix dünyasında, metin dosyalarındaki değişiklikleri " diff -u" tarafından üretilen biçimde yamalar olarak yayma geleneği vardır . Bu biçim daha sonra yama programı tarafından değişiklikleri bir metin dosyasına veya metin dosyalarını içeren bir dizin yapısına yeniden uygulamak (veya kaldırmak) için kullanılabilir.

Ancak, yama programı, yamayı üretmek için kullanılan kaynak dosyaya tam olarak benzemeyen bir dosyaya yamayı uygulamak için bazı olanaklara da sahiptir. Bu işleme bulanık yama uygulaması denir ve yama programı bunları uygulayacak bir yer bulamazsa yamadaki değişikliklerin atıldığı bir tür asimetrik üç yönlü birleştirme ile sonuçlanır.

CVS üzerinde komut kümesi olarak başladı gibi Diff3 , GNU Arch yama üzerinde komut kümesi olarak başladı. Bununla birlikte, bulanık yama uygulaması nispeten güvenilmez bir yöntemdir, bazen çok az içeriğe sahip yamaları yanlış uygular (özellikle yeni bir dosya oluşturanlar), bazen her iki türevin yaptığı silme işlemlerini uygulamayı reddeder.

Yama komütasyon

Yama komütasyon kullanılan Darcs değişiklikleri birleştirmek ve aynı zamanda uygulanan Git (ama "rebasing" olarak adlandırılır). Yama komütasyon birleştirme, yamaların sırasını (yani değişikliklerin tanımlarını) doğrusal bir geçmiş oluşturacak şekilde değiştirmek anlamına gelir. Aslında, ortak bir durum bağlamında iki yama yapıldığında, birleştirme üzerine, biri diğerinin bağlamında yapılmış gibi görünecek şekilde yeniden yazılır.

Yama değişimi, türev dosyalarında yapılan değişikliklerin tam olarak saklanmasını veya yeniden oluşturulabilmesini gerektirir. Bu kesin değişikliklerden, diğerini yeniden temellendirmek için birinin nasıl değiştirilmesi gerektiğini hesaplamak mümkündür. Örneğin, eğer A yaması F dosyasının 7. satırından sonra "X" satırını eklerse ve B yaması F dosyasının 310. satırından sonra "Y" satırını eklerse, A'yı yeniden temel alıyorsa B'nin yeniden yazılması gerekir: satırın üzerine eklenmesi gerekir. F dosyasının 311. satırı, çünkü A'ya eklenen satır satır numaralarını birer birer kaydırır.

Yama değişimi resmi olarak çokça çalışılmıştır, ancak yama komutasyonundaki birleştirme çatışmalarıyla başa çıkmak için algoritmalar hala açık araştırma soruları olarak kalmaktadır. Bununla birlikte, diğer birleştirme stratejilerinin çoğunlukla, kullanıcıların görmek istediklerini üretmeye çalışan buluşsal yöntemler olduğu durumlarda, yama komütasyonunun "doğru" birleştirme sonuçları ürettiği kanıtlanabilir.

"Pachutils" paketindeki Unix programı flipdiff , diff -u tarafından üretilen geleneksel yamalar için yama komütasyonunu uygular .

Örgü birleştirme

Örgü birleştirme, iki dosya için ortak bir atadan yararlanmayan bir algoritmadır. Bunun yerine, dosyaların türev sürümlerinde tek satırların nasıl eklendiğini ve silindiğini izler ve bu bilgiler üzerinde birleştirilmiş dosyayı üretir.

Örgü birleştirme, türev dosyalarındaki her satır için şu bilgileri toplar: hangi satırlar ondan önce gelir, hangi satırlar onu takip eder ve her iki türev tarihinin bir aşamasında silinip silinmediği. Herhangi bir türev satırı bir noktada silinmişse, birleştirilmiş sürümde mevcut olmamalıdır. Diğer satırlar için birleştirilmiş sürümde bulunmaları gerekir.

Çizgiler, her satırın tarihin bir noktasında kendisinden önce gelen tüm satırlardan sonra ve tarihin bir noktasında onu takip eden tüm satırlardan önce olduğu bir sıraya göre sıralanır. Bu kısıtlar tüm satırlar için toplam sıralama vermiyorsa, birbirine göre sıralaması olmayan satırlar çakışan eklemelerdir.

Örgü birleştirme, görünüşe göre ticari revizyon kontrol aracı BitKeeper tarafından kullanılmıştı ve üç yönlü birleştirmenin yanlış veya kötü sonuçlar ürettiği bazı sorun durumlarının üstesinden gelebilir. Aynı zamanda GNU Bazaar revizyon kontrol aracının birleştirme seçeneklerinden biridir ve Codeville'de kullanılır .

Ayrıca bakınız

Referanslar