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.