Mengapa penggabungan 3 arah menguntungkan daripada penggabungan 2 arah?

165

Wikipedia mengatakan penggabungan 3 arah lebih sedikit rawan kesalahan daripada penggabungan 2 arah, dan sering kali tidak memerlukan intervensi pengguna. Mengapa demikian?

Contoh di mana gabungan 3 arah berhasil dan gabungan 2 arah gagal akan sangat membantu.

Johannes Bittner
sumber

Jawaban:

259

Katakan Anda dan teman Anda sama-sama memeriksa file, dan membuat beberapa perubahan padanya. Anda menghapus satu baris di awal, dan teman Anda menambahkan satu baris di akhir. Lalu ia melakukan file-nya, dan Anda perlu menggabungkan perubahannya ke dalam salinan Anda.

Jika Anda melakukan penggabungan dua arah (dengan kata lain, diff), alat ini dapat membandingkan dua file, dan melihat bahwa baris pertama dan terakhir berbeda. Tetapi bagaimana ia tahu apa yang harus dilakukan dengan perbedaan? Haruskah versi yang digabungkan menyertakan baris pertama? Haruskah ini termasuk baris terakhir?

Dengan penggabungan tiga arah, ia dapat membandingkan dua file, tetapi juga dapat membandingkan masing-masing dengan salinan asli (sebelum salah satu dari Anda mengubahnya). Sehingga dapat melihat bahwa Anda menghapus baris pertama, dan bahwa teman Anda menambahkan baris terakhir. Dan itu dapat menggunakan informasi itu untuk menghasilkan versi gabungan.

JW.
sumber
"Tapi bagaimana itu bisa tahu apa yang harus dilakukan dengan perbedaan?" Tidak mengerti Jika sudah dapat melihat perbedaan antara kedua file (tanpa referensi ke yang asli), mengapa itu tidak bisa menerapkan kedua perubahan secara serial dalam meningkatkan urutan cap waktu file? Yaitu: Dimulai dengan salinan teman saya yang menjadikannya sebagai (asli) asli (dengan penambahan baris di bagian atas) dan kemudian, di atasnya, menerapkan perubahan lokal saya (penghapusan baris di bagian bawah).
Harry
7
@ Harry Say asli memiliki tiga baris (ABC). Dimulai dengan salinan teman saya (ABCD), dan membandingkannya dengan milik saya (BC). Tanpa melihat yang asli, mungkin berpikir bahwa saya menghapus A dan D, dan bahwa hasil akhirnya harus BC.
JW.
80

Slide ini dari presentasi terpaksa menarik:

gambar slide

Logika esensial dari alat penggabungan tiga arah adalah sederhana:

  • Bandingkan file basis, sumber, dan target
  • Identifikasi "potongan" di file sumber dan file target:
    • Bongkahan yang tidak cocok dengan pangkalan
    • Bongkahan yang cocok dengan pangkalan
  • Kemudian, kumpulkan hasil gabungan yang terdiri dari:
    • Potongan yang cocok satu sama lain di ketiga file
    • Potongan yang tidak cocok dengan basis di sumber atau target tetapi tidak di keduanya
    • Potongan yang tidak cocok dengan basis tetapi yang cocok satu sama lain (yaitu, mereka telah diubah dengan cara yang sama di kedua sumber dan target)
    • Placeholder untuk potongan yang bertentangan, harus diselesaikan oleh pengguna.

Perhatikan bahwa "potongan" dalam ilustrasi ini murni simbolis. Masing-masing dapat mewakili baris dalam file, atau node dalam hierarki, atau bahkan file dalam direktori. Itu semua tergantung pada kemampuan alat penggabung tertentu.

Anda mungkin bertanya keuntungan apa yang ditawarkan merger 3 arah dari gabungan 2 arah. Sebenarnya, tidak ada penggabungan dua arah, hanya alat yang membedakan dua file dan memungkinkan Anda untuk "menggabungkan" dengan memilih potongan dari satu file atau yang lain.
Hanya penggabungan 3 arah yang memberi Anda kemampuan untuk mengetahui apakah suatu chunk adalah perubahan dari asal dan apakah atau tidak mengubah konflik.

VONC
sumber
"Apakah perubahan konflik atau tidak." - tidak menggabungkan 2 arah (beda) juga menunjukkan konflik (meskipun info tersebut hilang sebagai sumber konflik) /
Vlad
1
Namun umum di Git untuk memiliki penggabungan 4 arah di mana basis sebenarnya tidak sama. Penggabungan 3 arah masih lebih baik dan 2 arah.
Wernight
@ Wight, Apakah ada penggabungan 5 arah?
Pacerier
@Pacerier Bukan yang saya tahu, tapi itulah yang sebenarnya terjadi selama git cherry-pick, atau rebase.
Wernight
Penjelasan yang sangat terperinci dan berguna
Kaneg
20

Saya menulis posting yang sangat rinci tentang hal itu . Pada dasarnya Anda tidak dapat melacak penghapusan / penambahan dengan dua arah, sangat, sangat tidak produktif.

pablo
sumber
@ Pedro, Jika saya menambahkan fungsi sebelum X dan Anda menambahkan fungsi lain setelah X dan kami melakukan penggabungan tiga arah, alat akan secara otomatis menerapkan kedua perubahan. Tetapi apa yang terjadi ketika perubahan saya benar-benar bertentangan dengan perubahan Anda (misalnya kita masing-masing membuat fungsi baru dengan nama fungsi yang sama)? Bagaimana cara penggabungan otomatis mengetahui bahwa beberapa penggabungan "kami yang sangat mudah" sebenarnya dapat menyebabkan konflik ?
Pacerier
1
Baca saja tutorial Anda, dan itu sangat membantu saya. Saya merasakan hal yang sama seperti pengembang yang Anda gambarkan. Saya selalu takut penggabungan tiga arah.
racl101
3
Saya sarankan Anda untuk menyalin dan menempelkan bagian dari artikel Anda. Saya pikir ini akan membantu Anda mendapatkan upvotes dan akan lebih selaras dengan filosofi stackoverflow.
Samuel
Artikel bagus Saya dulu suka menggunakan tambalan untuk rebase ketika Anda bisa melihat lebih banyak konteks dan dapat menggunakan editor dan lingkungan Anda untuk memeriksa sesuatu, ada terlalu banyak manual manual dari hal-hal mudah seperti itu. Sayang sekali tidak ada cara yang baik yang menggabungkan bagian-bagian yang baik dari keduanya
JonnyRaa
20

Penggabungan tiga arah di mana dua perubahan pada satu file basis digabungkan saat diterapkan, sebagai lawan menerapkan satu, lalu menggabungkan hasilnya dengan yang lain.

Misalnya, memiliki dua perubahan di mana baris ditambahkan di tempat yang sama dapat diinterpretasikan sebagai dua tambahan, bukan perubahan satu baris.

Sebagai contoh

file a telah dimodifikasi oleh dua orang, satu menambahkan moose, satu menambahkan mouse.

#File a
    dog
    cat

#diff b, a
    dog
+++ mouse
    cat

#diff c, a
    dog
+++ moose
    cat

Sekarang, jika kita menggabungkan perubahan saat kita menerapkannya, kita akan mendapatkan (gabungan 3 arah)

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

Tetapi jika kita menerapkan b, maka lihat perubahan dari b ke c itu akan terlihat seperti kita hanya mengubah 'u' menjadi 'o' (penggabungan 2 arah)

    #diff b, c
    dog
--- mouse
+++ moose
    cat
Theo Belaire
sumber