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, gitk
atau 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.
svn:mergeinfo
properti?svn:mergeinfo
dilakukannya.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.
sumber
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 ):
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.
sumber
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. .
sumber
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.
sumber
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.
sumber