Mengapa percabangan dan penggabungan lebih mudah di Mercurial daripada di Subversion?

92

Menangani beberapa penggabungan ke cabang di Subversion atau CVS hanyalah salah satu hal yang harus dialami. Jauh lebih mudah untuk melacak cabang dan penggabungan di Mercurial (dan mungkin sistem terdistribusi lainnya) tetapi saya tidak tahu mengapa. Apakah ada orang lain yang tahu?

Pertanyaan saya berasal dari fakta bahwa dengan Mercurial Anda dapat mengadopsi praktik kerja yang mirip dengan repositori sentral Subversions / CVS dan semuanya akan bekerja dengan baik. Anda dapat melakukan banyak penggabungan pada cabang yang sama dan Anda tidak memerlukan potongan kertas tanpa akhir dengan nomor komit dan nama tag.

Saya tahu versi terbaru Subversion memiliki kemampuan untuk melacak penggabungan ke cabang sehingga Anda tidak mendapatkan tingkat kerumitan yang sama tetapi itu adalah pengembangan besar dan besar di pihak mereka dan masih tidak melakukan semua yang tim pengembangan inginkan. suka melakukannya.

Harus ada perbedaan mendasar dalam cara kerjanya.

Nick Pierpoint
sumber

Jawaban:

115

Di Subversion (dan CVS), repositori adalah yang pertama dan terpenting. Dalam git dan mercurial sebenarnya tidak ada konsep repositori dengan cara yang sama; di sini perubahan adalah tema sentral.

+1

Kerumitan dalam CVS / SVN berasal dari kenyataan bahwa sistem ini tidak mengingat perubahan orang tua. Di Git dan Mercurial, tidak hanya sebuah commit dapat memiliki banyak anak, ia juga dapat memiliki banyak orang tua!

Itu dapat dengan mudah diamati menggunakan salah satu alat grafis, gitkatau hg view. Dalam contoh berikut, cabang # 2 bercabang dari # 1 pada komit A, dan sejak itu telah digabungkan sekali (di M, digabung dengan komit B):

o---A---o---B---o---C         (branch #1)
     \       \
      o---o---M---X---?       (branch #2)

Perhatikan bagaimana A dan B memiliki dua anak, sedangkan M memiliki dua orang tua . Hubungan ini dicatat di repositori. Katakanlah pengelola cabang # 2 sekarang ingin menggabungkan perubahan terbaru dari cabang # 1, mereka dapat mengeluarkan perintah seperti:

$ git merge branch-1

dan pahat akan secara otomatis mengetahui bahwa basisnya adalah B - karena itu dicatat dalam komit M, leluhur ujung # 2 - dan bahwa ia harus menggabungkan apa pun yang terjadi antara B dan C. CVS tidak merekam informasi ini , begitu pula SVN sebelum versi 1.5. Dalam sistem ini, grafiknya akan terlihat seperti:

o---A---o---B---o---C         (branch #1)
     \    
      o---o---M---X---?       (branch #2)

di mana M hanyalah komit "terjepit" raksasa dari segala sesuatu yang terjadi antara A dan B, diterapkan di atas M. Perhatikan bahwa setelah akta tersebut dilakukan, tidak ada jejak tersisa (kecuali berpotensi dalam komentar yang dapat dibaca manusia) di mana M memang berasal dari, atau dari berapa banyak komitmen yang runtuh bersama - membuat sejarah jauh lebih tak tertembus.

Lebih buruk lagi, melakukan penggabungan kedua menjadi mimpi buruk: kita harus mencari tahu apa dasar merge adalah pada saat penggabungan pertama (dan satu memiliki untuk mengetahui bahwa telah terjadi penggabungan di tempat pertama!), Maka kini yang informasi ke alat sehingga tidak mencoba memutar ulang A..B di atas M. Semua ini cukup sulit saat bekerja dalam kolaborasi yang erat, tetapi tidak mungkin dilakukan dalam lingkungan terdistribusi.

Masalah (terkait) adalah bahwa tidak ada cara untuk menjawab pertanyaan: "apakah X mengandung B?" di mana B adalah perbaikan bug yang berpotensi penting. Jadi, mengapa tidak merekam informasi itu di komit, karena diketahui pada saat penggabungan!

P.-S. - Saya tidak memiliki pengalaman dengan kemampuan merekam penggabungan SVN 1.5+, tetapi alur kerja tampaknya jauh lebih dibuat-buat daripada di sistem terdistribusi. Jika memang demikian, mungkin karena - seperti yang disebutkan dalam komentar di atas - fokus diletakkan pada organisasi repositori daripada pada perubahan itu sendiri.

Damien Diederen
sumber
6
SVN 1.5+ memang akan menempatkan properti SVN pada komit gabungan M yang mencantumkan komit gabungan di dalamnya, dengan kata lain AB. Jadi, Anda memiliki informasi yang sama.
Simon D
Agak. Secara teknis, pelacakan penggabungan SVN mirip dengan apa yang Git sebut sebagai "pemetik ceri," dengan keajaiban tambahan untuk mempermudah pengguna; ini secara semantik berbeda dari apa yang dilakukan Git, Hg dan Bzr saat menggabungkan. Saya kira itu tidak membuat banyak perbedaan dalam praktik selama Anda tidak peduli dengan DAG ( eagain.net/articles/git-for-computer-scientists ).
Damien Diederen
2
Sayangnya tidak ada tombol +100. Terima kasih.
Charlie Flowers
Saya berasumsi bahwa fitur SVN 1.5 yang Anda bicarakan adalah penggunaan svn:mergeinfoproperti?
MatrixFrog
@ MatrixFrog: Ya, inilah yang svn:mergeinfodilakukannya.
sleske
12

Karena Subversion (setidaknya versi 1.4 dan di bawahnya) tidak melacak apa yang telah digabungkan. Untuk Subversion, penggabungan pada dasarnya sama dengan setiap komit sementara pada kontrol versi lain seperti Git, apa yang telah digabungkan akan diingat.

htanata
sumber
7

Tidak tersentuh oleh salah satu jawaban yang sudah disediakan, Hg menawarkan kemampuan penggabungan yang superior karena menggunakan lebih banyak informasi saat menggabungkan perubahan ( hginit.com ):

Misalnya, jika saya mengubah sebuah fungsi sedikit, dan kemudian memindahkannya ke tempat lain, Subversion tidak terlalu mengingat langkah-langkah tersebut, jadi ketika tiba saatnya untuk menggabungkan, ia mungkin berpikir bahwa sebuah fungsi baru muncul tiba-tiba. . Sedangkan Mercurial akan mengingat hal-hal itu secara terpisah: fungsi berubah, fungsi dipindahkan, yang berarti bahwa jika Anda juga mengubah fungsi itu sedikit, kemungkinan besar Mercurial akan berhasil menggabungkan perubahan kita.

Tentu saja, mengingat apa yang terakhir digabungkan (poin yang dibahas oleh sebagian besar jawaban yang diberikan di sini) juga merupakan kemenangan besar.

Kedua perbaikan tersebut, bagaimanapun, dipertanyakan karena subversi 1.5+ menyimpan informasi penggabungan tambahan dalam bentuk properti subversi: informasi yang tersedia, tidak ada alasan yang jelas mengapa penggabungan subversi tidak dapat mengimplementasikan penggabungan sesukses Hg atau Git. Saya tidak tahu apakah itu benar, tetapi sepertinya pengembang subversi sedang dalam perjalanan untuk mengatasi masalah ini.

Tomislav Nakic-Alfirevic
sumber
4

Saya kira ini mungkin sebagian karena Subversion memiliki gagasan tentang server pusat bersama dengan garis waktu revisi yang mutlak. Mercurial benar-benar terdistribusi dan tidak memiliki referensi ke garis waktu absolut. Hal ini memungkinkan proyek Mercurial untuk membentuk hierarki cabang yang lebih rumit untuk menambahkan fitur dan siklus pengujian oleh sub proyek namun tim sekarang harus lebih aktif terus memantau penggabungan agar tetap terkini karena mereka tidak bisa hanya menekan pembaruan dan menyelesaikannya. .

Andy yang jahat
sumber
3

Di Subversion (dan CVS), repositori adalah yang pertama dan terpenting. Dalam git dan mercurial sebenarnya tidak ada konsep repositori dengan cara yang sama; di sini perubahan adalah tema sentral.

Saya tidak terlalu memikirkan bagaimana Anda akan menerapkannya, tetapi kesan saya (berdasarkan pengalaman pahit dan banyak bacaan) adalah bahwa perbedaan inilah yang membuat penggabungan dan pencabangan jauh lebih mudah dalam sistem berbasis non-repositori.

Stephen Darlington
sumber
1

Saya hanya memiliki pengalaman dengan Subversion tetapi saya dapat memberitahu Anda bahwa layar penggabungan di TortoiseSVN sangat rumit. Untungnya mereka menyertakan tombol uji coba sehingga Anda dapat melihat apakah Anda melakukannya dengan benar. Komplikasi ada pada konfigurasi apa yang ingin Anda gabungkan ke tempat. Setelah Anda menyiapkan penggabungan tersebut, penggabungan biasanya berjalan dengan baik. Kemudian Anda perlu menyelesaikan setiap dan semua konflik dan kemudian mengkomit gabungan Anda dalam copy pekerjaan ke repositori.

Jika Mercurial dapat membuat konfigurasi penggabungan lebih mudah maka saya dapat mengatakan itu akan membuat penggabungan 100% lebih mudah daripada Subversion.

RedWolves
sumber