Model data internal secara fundamental berbeda.
Pada dasarnya, di SVN, ketika Anda melihat sejarah cabang, Anda hanya melihat apa yang terjadi di cabang itu. Jadi, ketika Anda menggabungkan dari cabang B
ke cabang A
, sejarah cabang A
akan berisi satu komit besar yang berisi semua perubahan yang dibuat secara eksplisit B
sejak bercabang.
Di versi SVN pertama, jika Anda harus menggabungkan cabang B
menjadi cabang A
sekali lagi, Anda harus secara manual menentukan rentang revisi cabang mana B
yang ingin Anda gabungkan untuk menghindari penggabungan revisi yang sama dua kali. Pengembang yang pintar tentu saja akan menggunakan pesan komit seperti 'Digabung dalam B: 1234'.
SVN 1.5 "memperbaiki" ini. Tetapi itu tidak mengubah bagaimana penggabungan diterapkan secara fundamental. Itu hanya menambahkan beberapa metadata tambahan ke cabang A
, membiarkan SVN tahu bahwa revisi 1234 telah digabungkan, memungkinkan SVN untuk secara otomatis memilih rentang revisi yang benar.
Tetapi solusi ini pada dasarnya merupakan solusi untuk model data yang pada dasarnya tidak mendukung melacak apa yang telah digabungkan.
Menggabungkan dua cabang adalah contoh yang relatif sederhana. Tetapi pencitraan skenario yang lebih kompleks ini
- Buat cabang
A
dari trunk
, dan buat beberapa komitmen di sini
- Buat cabang
B
dari A
dan buat beberapa komitmen di sini
- Buat beberapa komitmen dalam
trunk
danA
- Gabung
B
ketrunk
- Gabung
A
keB
- Gabung
A
ketrunk
- Gabung
B
ke trunk
(ini tidak harus benar-benar melakukan apa-apa)
Menangani ini dengan benar menggunakan model metadata menjadi sangat kompleks (saya tidak tahu apakah SVN memang menangani skenario ini dengan benar, dan saya tidak merasa cenderung untuk mengujinya).
Menangani skenario ini di git sangat sederhana.
Di git, setiap kali Anda melakukan, objek internal yang mewakili komit berisi referensi ke kepala sebelumnya. Ketika Anda menggabungkan cabang, komit berisi referensi ke kepala sebelumnya dari semua cabang yang digabung (Anda dapat menggabungkan lebih dari satu cabang sekaligus dalam git)
Oleh karena itu, ketika Anda memeriksa sejarah satu commit di git, Anda bisa melihat semua histori, Anda bisa melihat kapan itu bercabang, kapan itu digabung, dan Anda bisa melihat sejarah kedua cabang antara percabangan dan penggabungan.
Jadi ketika menggabungkan cabang yang telah sebagian digabung, sangat mudah untuk menentukan apa yang sudah digabung, dan apa yang belum.
Saya tidak punya pengalaman dengan Mercurial, tetapi saya curiga cara kerjanya mirip dengan git.
Jadi pada dasarnya, untuk SVN, itu adalah tujuan desain untuk membuat percabangan murah. Tetapi dalam git, itu adalah tujuan desain untuk membuat penggabungan menjadi murah.
Terakhir, terakhir kali saya menggunakan SVN, itu tidak dapat menangani penggabungan, di mana file diubah namanya di satu cabang, dan dimodifikasi di yang lain.