3 yönlü birleştirme, 2 yönlü birleştirme yerine neden avantajlıdır?


165

Wikipedia , 3 yönlü birleştirme işleminin 2 yönlü birleştirme işleminden daha az hataya açık olduğunu ve çoğu zaman kullanıcı müdahalesine gerek olmadığını söylüyor. Neden böyle?

3 yönlü birleştirmenin başarılı olduğu ve 2 yönlü birleştirmenin başarısız olduğu bir örnek yardımcı olabilir.

Yanıtlar:


259

Siz ve arkadaşınızın bir dosyayı teslim aldığını ve dosyada bazı değişiklikler yaptığını varsayalım. Başlangıçta bir çizgi çıkardınız ve arkadaşınız sonuna bir çizgi ekledi. Sonra dosyasını işledi ve değişikliklerini kopyanızla birleştirmeniz gerekiyor.

İki yönlü birleştirme yapıyorsanız (başka bir deyişle, fark), araç iki dosyayı karşılaştırabilir ve ilk ve son satırların farklı olduğunu görebilir. Fakat farklılıklar ile ne yapacağını nasıl bilebilirdi? Birleştirilmiş sürüm ilk satırı içermeli mi? Son satırı içermeli mi?

Üç yönlü birleştirme ile iki dosyayı karşılaştırabilir, ancak her birini orijinal kopyayla da (her ikiniz de değiştirmeden önce) karşılaştırabilir. Böylece ilk satırı kaldırdığınızı ve arkadaşınızın son satırı eklediğini görebilirsiniz. Ve bu bilgileri birleştirilmiş versiyonu oluşturmak için kullanabilir.


"Ama farklılıklarla ne yapacağını nasıl bilebilirdi?" Anlamadım. İki dosya arasındaki farkları (orijinaline başvurmadan) zaten görebiliyorsa, neden her iki değişikliği de dosyaların zaman damgalarını artan sırada seri olarak uygulayamıyor? Bu, arkadaşımın taahhütlü kopyasını (yeni) orijinal (üstte satır ekleme ile) olarak alarak başlar ve daha sonra, yerel değişiklikleri (bottonda satır silme) uygular.
Harry

7
@Harry Orijinalinde üç satır (ABC) olduğunu söyle. Arkadaşımın kopyasıyla (ABCD) başlar ve onu benimkiyle (BC) karşılaştırır. Orijinali görmeden, hem A hem de D'yi kaldırdığımı ve nihai sonucun BC olması gerektiğini düşünebilir.
JW.

80

Performans sunumundaki bu slayt ilginç:

slayt resmi

Üç yollu birleştirme aracının temel mantığı basittir:

  • Temel, kaynak ve hedef dosyaları karşılaştırın
  • Kaynak ve hedef dosyalar dosyasındaki "parçaları" tanımlayın:
    • Tabana uymayan parçalar
    • Tabana uyan parçalar
  • Ardından, aşağıdakilerden oluşan birleştirilmiş bir sonuç bir araya getirin:
    • 3 dosyanın hepsinde birbiriyle eşleşen parçalar
    • Kaynakta veya hedefte tabanla eşleşmeyen ancak her ikisinde de bulunmayan parçalar
    • Tabana uymayan ancak birbiriyle eşleşen parçalar (yani, hem kaynakta hem de hedefte aynı şekilde değiştirildi)
    • Çakışan parçalar için kullanıcı tarafından çözülecek yer tutucular.

Bu çizimdeki "parçalar" ın tamamen sembolik olduğunu unutmayın. Her biri bir dosyadaki satırları veya bir hiyerarşideki düğümleri veya hatta bir dizindeki dosyaları temsil edebilir. Her şey belirli bir birleştirme aracının neler yapabileceğine bağlıdır.

3 yönlü birleştirme, 2 yönlü birleştirme üzerinde ne gibi avantajlar sunuyor olabilir. Aslında, iki yönlü birleştirme diye bir şey yoktur, sadece iki dosyayı ayıran ve bir dosyadan veya diğerinden parçalar seçerek "birleştirmenize" izin veren araçlar yoktur.
Yalnızca 3 yönlü birleştirme, bir öykünün başlangıç ​​noktasından bir değişiklik olup olmadığını ve değişikliklerin çakışma olup olmadığını bilmenizi sağlar.


msgstr "anlaşmazlığın değişip değişmeyeceği." - 2 yönlü birleştirme (fark) da bir çatışma göstermiyor (çatışmanın kaynağı olarak bilgi kaybolmasına rağmen) /
Vlad

1
Ancak Git'te, tabanın aslında aynı olmadığı 4 yönlü birleştirme yapmak yaygındır. Yine de 3 yönlü birleştirme daha iyi ve 2 yönlüdür.
Wernight

@Wernight, 5 yönlü birleştirme var mı?
Pacerier

@Pacerier Bildiğimden değil, ama bir git kiraz toplama veya rebase sırasında gerçekte olan bu.
Wernight

Çok detaylı ve kullanışlı açıklama
Kaneg

20

Bu konuda çok ayrıntılı bir yazı yazdım . Temel olarak silme / ekleme işlemlerini iki yönlü, çok, çok verimsiz olarak izleyemezsiniz.


@pablo, X'ten önce bir işlev eklersem ve X'ten sonra başka bir işlev eklerseniz ve üç yönlü birleştirme yaparsak, araç her iki değişikliği de otomatik olarak uygular. Ancak benim değişikliğim aslında değişikliğinizle çakıştığında ne olur (örneğin her birimiz aynı işlev adıyla yeni bir işlev yaratırız)? Otomatik birleşmenin bazı "sıkıcı derecede kolay" birleştirmemizin aslında bir çatışmaya neden olabileceğini nasıl bilebiliriz ?
Pacerier

1
Sadece öğreticinizi okuyun ve bu bana çok yardımcı oluyor. Tarif ettiğiniz geliştiricilerle aynı şekilde hissediyorum. Üçlü birleşmeden daima korktum.
racl101

3
Makalenizin bazı bölümlerini kopyalayıp yapıştırmanızı öneririm. Bence bu, oy almanıza yardımcı olacak ve stackoverflow felsefesi ile daha uyumlu olacak.
Samuel

İyi makale. Daha fazla bağlam görmek ve editör ve ortamınızı bir şeyleri kontrol etmek için kullanabilmeniz için yamaları yeniden kullanmak için eskiden hoşlanıyordum, ancak kolay şeylerin bu şekilde manuel olarak çok fazla karıştırılması var. Onun utanç verici her ikisi de iyi bölümlerini birleştiren güzel bir yolu yok
JonnyRaa

20

Bir temel dosyadaki iki değişiklik kümesinin, bir tane uygulamak yerine, uygulandıkça birleştirildikten sonra sonucu diğeriyle birleştirildiği üç yönlü birleştirme.

Örneğin, bir satırın aynı yere eklendiği yerde iki değişikliğe sahip olmak, bir satırın değişikliği değil, iki ekleme olarak yorumlanabilir.

Örneğin

a dosyası, biri geyik, diğeri fare ekleyerek iki kişi tarafından değiştirildi.

#File a
    dog
    cat

#diff b, a
    dog
+++ mouse
    cat

#diff c, a
    dog
+++ moose
    cat

Şimdi, değişiklik kümelerini uygularken birleştirirsek, (3 yönlü birleştirme) elde ederiz

#diff b and c, a
    dog
+++ mouse
+++ moose
    cat

Ancak b'yi uygularsak, b'den c'ye olan değişime bakın, sadece 'u'yu bir' o '(2 yönlü birleştirme) olarak değiştiriyoruz gibi görünecektir.

    #diff b, c
    dog
--- mouse
+++ moose
    cat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.