Apa kontrol revisi yang memiliki mesin penggabung terbaik? [Tutup]

8

Ketika datang ke penggabungan, setiap versi kontrol memiliki mesin untuk melakukannya. Konflik tidak dapat dihindari tetapi pertanyaannya adalah - kontrol revisi mana yang memiliki AI terbaik untuk menghindari konflik.

Apakah mungkin mengukur hal seperti itu?

Lebih khusus lagi, kami berpikir untuk pindah ke GIT karena memiliki sensasi dan rumor yang bagus yang menangani konflik dengan lebih baik ...

Setiap komentar dihargai ...

confiq
sumber
10
Pada akhirnya, tidak ada VCS yang dapat menangani "tutup gabungan" dengan baik tanpa melakukan sesuatu yang duniawi. Jika satu orang menambahkan logika dalam rutinitas yang berjalan dalam satu arah, dan orang lain melakukan sesuatu yang serupa - tetapi sama sekali berbeda - manusia harus terlibat.
Peter Rowell
1
Secara teori, menggabungkan algoritma bisa sangat baik jika mereka benar-benar menyusun kode sumber. Sepertinya di luar sana, tapi mungkin hanya masalah waktu saja.
Karl Bielefeldt
1
@ Kararl: eh? kompilasi kode sumber apa - jika saya mengubah baris untuk mengatakan x = 1 dan rekan saya mengubah baris yang sama dengan mengatakan x = 2, bagaimana kompiler akan mencari tahu mana yang 'benar' mengingat sisa komitmen yang digabung.
gbjbaanb
1
@ gbj, Anda tidak akan pernah bisa menghindari campur tangan manusia sepenuhnya, seperti yang dibuktikan oleh contoh Anda. Namun, mengkompilasi kode sumber bisa lebih mudah menggabungkan hal-hal seperti nama variabel atau metode, atau membuat perubahan dalam dua cara yang identik secara fungsional tetapi berbeda secara tekstual.
Karl Bielefeldt
Tidak dapat menguji menyelesaikan beberapa faktor "manusia". Manusia tahu apa yang mereka coba hasilkan, sehingga konflik bisa diselesaikan dengan menyusun dan menjalankan tes. Tes unit harus berada pada level yang cukup kecil sehingga beberapa pembaruan dengan metode yang sama harus layak dalam beberapa lintasan, jika tes berhasil kedua cara manusia perlu terlibat, jika sistem gabungan menentukan ada terlalu banyak variasi yang kompilasi tidak dapat ditelusuri, manusia harus dilibatkan.
Quaternion

Jawaban:

21

Saya kira ini bukan pertanyaan yang tepat untuk ditanyakan.

Masalahnya adalah ada banyak kasus sudut, dan algoritma "pintar" untuk menggabungkan dapat menipu diri mereka sendiri dengan berpikir bahwa mereka telah melakukan penggabungan dengan benar padahal sebenarnya mereka telah benar-benar mengambil kode Anda. Jika Anda beruntung, penggabungan yang buruk menyebabkan kegagalan waktu kompilasi. Jika Anda tidak beruntung, itu mungkin memperkenalkan bug halus yang membutuhkan waktu lama untuk dilacak.

Git menggunakan algoritma penggabungan yang cukup mudah dan mengangkat tangannya dan meminta bantuan jika tidak dapat melakukan penggabungan. Menurut pendapat saya, ini persis apa yang Anda ingin sistem kontrol versi Anda lakukan. Jumlah kesedihan yang Anda hindarkan dengan ini sepadan dengan waktu yang Anda perlukan untuk memperbaiki konflik secara manual. (Juga, jika ada konflik dalam penggabungan, git mencantumkan file yang konflik dalam pesan komit yang dibuat secara otomatis untuk Anda - ini adalah hal yang sangat berguna untuk menemukan kesalahan saat Anda membuka riwayat kode Anda.)

ebneter
sumber
6

Telah dikatakan bahwa algoritma terbaik adalah aljabar tambalan Darcs . Codeville juga memiliki algoritma yang menarik dalam pengembangan.
Namun, untuk semua alasan praktis, alat apa pun yang menggunakan penggabungan tiga arah akan dilakukan. Ini termasuk git (dengan varian), lincah, bazaar, dan banyak alat eksternal (pengecualian penting: opendiff dan kaleidoskop di Mac), jadi dengan probabilitas yang baik Anda sudah menggunakan opsi terbaik; seperti dicatat oleh @Peter, ada kasus di mana tidak ada algoritma yang dapat membantu Anda.

Lalu
sumber
4
Ada yang perbedaan halus antara algoritma merge 3-way, seperti yang nenek moyang yang dipilih, dan dalam kualitas 2-cara diffs mereka gunakan dalam pencocokan atas garis, tapi kau benar bahwa kasus di mana itu membuat perbedaan praktis relatif jarang.
Karl Bielefeldt
TMK Mercurial tidak memiliki penggabungan 3 arah sejati, Anda harus melakukan 2 penggabungan dua arah
TheLQ
@TheLQ dokumen mengatakan sebaliknya: mercurial.selenic.com/wiki/MergeProgram tetapi mereka sedikit kurang detail
Agos
@TheLQ - Ada perbedaan besar antara tiga cara diff dan gabungan tiga cara . Perbedaan tiga arah adalah dua file yang akan digabung plus leluhur yang sama, di mana leluhur yang sama memungkinkan Anda untuk melihat bagaimana kedua sumber tersebut berbeda. Sebuah tiga cara merge akan membutuhkan diff empat cara , tiga file yang berbeda ditambah mereka nenek moyang yang sama.
Mark Booth
3

Saya menggunakan git dan lincah tetapi pertanyaan Anda ingat saya teori patch darcs. Anda akan membaca pekerjaan rumah untuk akhir pekan ini.

PD: Jangan tanya saya tentang teori tambalan, ini sangat kompleks untuk saya :)

Rufo El Magufo
sumber
hal-hal menarik, ingatlah bahwa SVN melakukan penggabungan dengan menerapkan tambalan, tetapi algoritma tambalan lengkap yang menerapkan huruf r dan m pada kata yang sama tidak akan memberi Anda hasil yang tepat - Anda masih memerlukan intervensi manusia dalam kasus ini.
gbjbaanb
3

Itu disebut Kontrol Revisi Manusia. (Human Merging Engine)

Kami menggunakan Seapine Surround dan sebagian besar melakukan penggabungan dengan baik, tetapi satu-satunya cara untuk memperbaiki konflik gabungan yang tidak dapat dilakukan kontrol sumber adalah melalui intervensi manusia.

Jadi, saran saya adalah:

Cobalah untuk bergabung dengan cepat. Satu mimpi buruk adalah memiliki cabang yang tidak bergabung kembali dengan jalur utama selama hampir 2 tahun. Ketika digabung, banyak konflik yang perlu diselesaikan. Satu pengembang mendapat julukan "master gabungan" setelah menghabiskan banyak waktu memperbaiki masalah penggabungan.

Berhati-hatilah dengan kode yang dibuat secara otomatis dari penyihir dll. Kadang-kadang ini bisa menyebalkan, terutama jika dua cabang di-autogenerasikan secara otomatis pada file yang sama.

Cobalah untuk mengontrol pengembangan. Jika pengembang A merobek file kode X dan Y, tidak masuk akal bagi pengembang B untuk bekerja pada X dan Y di cabang yang berbeda. Bagian dari manajemen gabungan adalah untuk mencoba dan mengendalikan apa yang sedang dimodifikasi untuk menghindari potensi konflik gabungan.

Ini bukan untuk mengatakan bahwa 2 pengembang tidak dapat bekerja pada file yang sama di 2 cabang yang berbeda. Jika 1 pengembang menambahkan metode A dan yang lain menambahkan metode B, maka penggabungan harus terjadi tanpa rasa sakit.

Pada akhirnya akan selalu ada beberapa konflik yang membutuhkan intervensi manusia. Dengan menjaga mereka ke minimum Anda akan memiliki hasil penggabungan terbaik.

Jon Raynor
sumber
2
File yang dibuat secara otomatis IMHO tidak boleh dalam kontrol versi. Hanya file yang digunakan untuk membuatnya.
Calmarius
2

Mesin penggabungan sempurna akan memahami semantik file yang sedang digabungkan: sehingga mem-parsing dan memahami kode sumber. Saya belum melihat kontrol mesin / versi gabungan seperti ...

Sebagian besar alat menggabungkan file sebagai teks. Jadi saya tidak akan pernah mengandalkan mereka secara membabi buta, itu selalu ide yang baik untuk meninjau perubahan sebelum melakukan itu ke cabang Anda.

Kami menggunakan Perforce, yang tidak bergabung secara otomatis. Setiap kali file sumber berubah relatif terhadap basis umum, itu akan mengatakan file target perlu diselesaikan bahkan jika tidak ada konflik. Jadi saya membuka alat penggabungan hanya untuk dengan cepat langkah berpikir bakhil untuk memeriksa apakah mereka cocok (dan mendapatkan gambaran kasar apa yang dilakukan rekan-rekan lain), paling sering mereka akan cocok dan menerima hasilnya.

Saya juga berlangganan notifikasi perubahan dari arus utama sehingga saya menggabungkan perubahan ke cabang saya sedini mungkin sehingga saya dapat menghindari masalah di kemudian hari.

Calmarius
sumber
1

Erm ...

Saat menggunakan mercurial (dan git juga, saya cukup yakin) Anda memilih mesin gabung Anda, secara default itu kdiff3 tetapi Anda dapat menggunakan apa pun yang Anda suka (di luar perbandingan, p4merge dll.).

AFAIK mesin gabungan dan VCS sering kali benar-benar terpisah , seperti kompiler dan editor teks Anda. Ambil XML vs kode misalnya, Anda akan ingin hal-hal yang berbeda untuk menggabungkan mereka, mereka tidak berfungsi dengan cara yang sama sehingga tidak dapat digabungkan dengan cara yang sama.

Jika Anda mengganti kontrol versi karena Anda memerlukan alat penggabungan yang lebih baik untuk melakukannya karena alasan yang salah, Anda hanya perlu mengganti kontrol versi ketika yang Anda gunakan sekarang tidak sesuai dengan proses Anda dengan baik (atau yang lain akan memungkinkan Anda menggunakan proses yang lebih baik).

Ed James
sumber
1
Setiap VCS memiliki algoritme penggabungan internal yang digunakan - alat penggabung yang Anda rujuk hanya digunakan ketika ada konflik yang tidak dapat diselesaikan oleh mesin internal. Pertanyaan yang diajukan adalah, algoritma penggabungan VCS mana yang "terbaik", meskipun saya tidak yakin itu pertanyaan yang didefinisikan dengan baik. Beberapa orang mendefinisikannya sebagai "menghasilkan konflik paling sedikit yang membutuhkan resolusi"; Saya akan mengatakan, memberikan kesalahan paling sedikit.
ebneter
1
Saya cukup yakin bahwa lincah benar-benar menggunakan alat berbeda itu di belakang layar, ada pengaturan sehingga Anda dapat mengubahnya di suatu tempat. Semua alat diff yang saya sebutkan memiliki mode penggabungan 3 arah (bukan hanya mode diff), dan p4merge jelas merupakan alat yang digunakan perforce ketika mendeteksi tabrakan. Saya pikir VCS itu sendiri hanya memiliki algoritma pendeteksian tabrakan (yaitu apakah Anda mengubah file yang sama di tempat yang sama), yang merupakan prekursor untuk penggabungan.
Ed James
Secara default, Mercurial menggunakan algoritma penggabungan tiga arah yang sederhana. Namun, ya, Anda bisa menimpanya. Anda bisa mengesampingkan gabungan bawaan di sebagian besar alat VCS, dalam hal ini. Namun, AFAIK, semuanya menggunakan beberapa algoritma penggabungan internal untuk mencari konflik, dan itu benar-benar titik kunci di sini - jika algoritma penggabungan internal VCS Anda terlalu pintar, mungkin tidak menemukan konflik di mana seharusnya.
ebneter
Dalam DVCS saya berharap bahwa setiap kali cabang digabungkan maka akan menjalankan file apa pun yang diedit di kedua cabang melalui alat gabungan utama. Anda tidak perlu mencari konflik gabungan, anggap saja ada satu, jika tidak ada maka Anda tidak kehilangan apa-apa. Saya membayangkan hal yang sama berlaku untuk VCS standar.
Ed James
Apa yang Anda maksud dengan "alat gabungan utama?" Algoritma default, atau yang Anda tentukan? Jika Anda maksud yang terakhir, seadil yang saya tahu, tidak ada yang bekerja seperti itu. Setiap VCS yang saya kenal menggunakan algoritma internal mereka untuk menggabungkan dan hanya memanggil alat yang dipilih pengguna jika ada konflik. Perhatikan bahwa beberapa VCS seperti git memungkinkan Anda untuk memilih di antara beberapa strategi bawaan, dan beberapa VCS memiliki algoritma internal yang cukup canggih - tetapi itu mengarah pada masalah yang saya jelaskan dalam jawaban saya.
ebneter
1

Konflik tidak dapat dihindari

Seberapa baik VCS menangani konflik dalam file ada dalam pikiran saya agak berlebihan. Untuk satu hal, cara terbaik untuk menangani konflik seperti itu adalah tidak memilikinya. Memfaktorkan perangkat lunak Anda dengan baik dan membagi tugas dengan yang diperkirakan akan sangat mengurangi konflik dalam sekelompok file (apalagi dalam file). Lakukan pekerjaan yang buruk seperti melempar di satu kelas dewa terlalu banyak, atau file konfigurasi umum yang harus digunakan setiap orang dan semua orang ingin bercampur dengan dan Anda meminta konflik tingkat file.

Untuk yang lain, mereka semua menggunakan algoritma yang hampir sama (buruk). Contoh: Rilis alpha dari proyek kami mengalami kebocoran memori minor. Itu lebih dari tetesan daripada kebocoran, dan kebocoran berhenti pada akhir waktu inisialisasi. Layak untuk diperbaiki, tidak layak untuk perbaikan. Salah satu pelanggan kami "memperbaiki" masalah, menempatkan yang gratis di tempat yang salah. Masalahnya diperbaiki pada rilis berikutnya. Pelanggan ini menggabungkan rilis baru daripada melakukan penggantian lengkap (WTF?). Tidak ada konflik dalam penggabungan tiga arah; panggilan untuk bebas terisolasi satu sama lain. Jadi sekarang perangkat lunak menjatuhkan inti karena bebas ganda.

Apa yang dilewatkan dalam diskusi adalah seberapa sulit / memakan waktu / rawan kesalahan untuk menggabungkan pekerjaan Anda kembali ke jalur utama perangkat lunak.

Di svn, kamu

  • Komit perubahan ke cabang Anda.
  • Gabungkan batang ke cabang Anda.
  • Jika Anda memiliki proyek besar, Anda mungkin ingin berpikir untuk mengambil rehat kopi atau pergi makan siang.
  • Berdoalah agar Anda tidak melihat konflik pohon saat Anda kembali.
  • Komit hasil merger ke cabang Anda.
  • Gabungkan cabang Anda ke dalam bagasi.
  • Istirahat kopi lagi.
  • Sekali lagi berdoa agar Anda tidak akan melihat konflik pohon ketika Anda kembali.
  • Komit perubahan Anda kembali ke bagasi.
  • Tutup pintu Anda untuk menghindari konflik dengan rekan kerja Anda yang mencoba melakukan hal yang sama.

Itu adalah langkah non-atom yang jauh, terlalu banyak tempat di mana kesalahan dapat terjadi (konflik pohon tidak menyenangkan), dan itu membutuhkan terlalu banyak waktu. Saya telah melihat banyak proyek yang menyerah menggunakan cabang dengan subversi berkat proses penggabungan yang begitu memakan waktu dan rawan kesalahan. Saya telah melihat lebih banyak proyek beralih dari subversi sama sekali sebagian besar karena ini.

David Hammen
sumber
1

Ada test suite kecil yang disebut merge-ini yang membandingkan sistem kontrol revisi terhadap skenario penggabungan dunia nyata. Untuk setiap skenario, itu memastikan VCS dapat melakukan hal berikut dengan benar:

  • menggabungkan cabang tanpa konflik
  • menghasilkan kode yang mengkompilasi
  • menghasilkan kode yang berperilaku dengan benar

Berdasarkan jumlah uji kelulusan pada penggabungan-ini, tampak bahwa ada dua tingkatan kinerja:

  1. Sayang, Git
  2. Bazaar, Mercurial

Bergantung pada bahasa pemrograman mana yang Anda coba gabungkan, hasil pengujian yang tepat mungkin penting. Lihat situs web proyek untuk tabel perbandingan terperinci.

mndrix
sumber
0

Saya telah menggunakan IBM / Rational ClearCase dan penggabungan multi-cabang sangat mengagumkan. Menjalankan cincin di sekitar subversi. (Tidak ada pengalaman Git atau lincah.)

dengan cepat_now
sumber
Penggabungan hg adalah par atau lebih baik dari cc. Saya sudah menggunakan keduanya.
Paul Nathan