Saya mencoba memahami manfaat sistem kontrol versi terdistribusi (DVCS).
Saya menemukan pendidikan ulang Subversion dan artikel ini oleh Martin Fowler sangat berguna.
DVCS Mercurial dan yang lainnya mempromosikan cara baru untuk mengerjakan kode dengan perubahan dan komitmen lokal. Ini mencegah penggabungan neraka dan masalah kolaborasi lainnya
Kami tidak terpengaruh oleh hal ini karena saya mempraktikkan integrasi berkelanjutan dan bekerja sendirian di cabang pribadi bukanlah suatu pilihan, kecuali jika kami sedang bereksperimen. Kami menggunakan cabang untuk setiap versi utama, di mana kami memperbaiki bug yang digabungkan dari bagasi.
Mercurial memungkinkan Anda untuk memiliki letnan
Saya mengerti ini bisa berguna untuk proyek yang sangat besar seperti Linux, tetapi saya tidak melihat nilainya dalam tim kecil dan sangat kolaboratif (5 hingga 7 orang).
Mercurial lebih cepat, membutuhkan lebih sedikit ruang disk dan salinan lokal lengkap memungkinkan operasi log & diff yang lebih cepat.
Saya juga tidak khawatir dengan ini, karena saya tidak melihat masalah kecepatan atau ruang dengan SVN bahkan dengan proyek yang sangat besar yang saya kerjakan.
Saya mencari pengalaman dan / atau pendapat pribadi Anda dari mantan Geeks SVN. Terutama mengenai konsep perubahan dan peningkatan kinerja keseluruhan yang Anda ukur.
UPDATE (12 Januari) : Saya sekarang yakin bahwa itu patut dicoba.
UPDATE (12 Juni) : Saya mencium Mercurial dan saya menyukainya. Rasa ceri lokalnya dilakukan. Saya mencium Mercurial hanya untuk mencobanya. Saya harap Server SVN saya tidak keberatan. Rasanya sangat salah. Rasanya benar. Jangan berarti aku jatuh cinta malam ini .
FINAL UPDATE (29 Jul) : Saya mendapat hak istimewa untuk mengulas buku Eric Sink berikutnya yang disebut Version Control by Example . Dia selesai meyakinkan saya. Saya akan pergi untuk Mercurial.
svn
,git
danhg
selama bertahun-tahun, saya cukup menyadari pro dan kontra mereka. Meskipungit
tentu saja yang paling kuat dari ini, penting untuk mengakui bahwa lebih kuat tidak secara otomatis menyiratkan lebih baik . Emacs tentu saja lebih kuat daripada editor teks javascript yang berjalan di browser web, tetapi, anehnya, saya menulis komentar ini menjadi editor teks browser javascript sekarang! Kesederhanaan , bahkan kebodohan, memiliki nilai dalam banyak konteks. Menggunakan terpusatsvn
dan sesuatu sepertigit-svn
lokal menawarkan yang terbaik dari kedua dunia.Jawaban:
Catatan: Lihat "EDIT" untuk jawaban pertanyaan saat ini
Pertama-tama, baca Subversion Re-education oleh Joel Spolsky. Saya pikir sebagian besar pertanyaan Anda akan dijawab di sana.
Rekomendasi lain, pembicaraan Linus Torvalds di Git: http://www.youtube.com/watch?v=4XpnKHJAok8 . Yang lain ini mungkin juga menjawab sebagian besar pertanyaan Anda, dan itu cukup menghibur.
BTW, sesuatu yang saya temukan cukup lucu: bahkan Brian Fitzpatrick & Ben Collins-Sussman, dua pencipta subversi asli mengatakan dalam satu google talk "maaf tentang itu" merujuk pada subversi yang lebih rendah daripada lincah (dan DVCS pada umumnya).
Sekarang, IMO dan secara umum, dinamika tim berkembang lebih alami dengan DVCS apa pun, dan manfaat yang luar biasa adalah Anda dapat melakukan offline karena itu menyiratkan hal-hal berikut:
Tentang poin Anda:
Saya berkontribusi beberapa dokumentasi untuk proyek Joomla untuk membantu mengkhotbahkan migrasi ke DVCS, dan di sini saya membuat beberapa diagram untuk menggambarkan terpusat vs didistribusikan.
Terpusat
Didistribusikan dalam praktik umum
Didistribusikan secara maksimal
Anda lihat di diagram masih ada "repositori terpusat", dan ini adalah salah satu argumen favorit penggemar versi terpusat: "Anda masih terpusat", dan tidak, Anda tidak, karena repositori "terpusat" hanyalah repositori Anda semua setuju (mis. repo github resmi), tetapi ini dapat berubah kapan saja Anda butuhkan.
Sekarang, ini adalah alur kerja khas untuk proyek sumber terbuka (misalnya proyek dengan kolaborasi besar-besaran) menggunakan DVCS:
Bitbucket.org agak setara dengan github untuk mercurial, ketahuilah bahwa mereka memiliki repositori pribadi tanpa batas dengan ruang tak terbatas, jika tim Anda lebih kecil dari lima, Anda dapat menggunakannya secara gratis.
Cara terbaik Anda dapat meyakinkan diri Anda untuk menggunakan DVCS adalah dengan mencoba DVCS, setiap pengembang DVCS berpengalaman yang telah menggunakan svn / cvs akan memberi tahu Anda bahwa itu sepadan dan bahwa mereka tidak tahu bagaimana mereka bertahan sepanjang waktu tanpa itu.
EDIT : Untuk menjawab mengedit kedua saya hanya bisa menegaskan kembali bahwa dengan DVCS Anda memiliki alur kerja yang berbeda, saya akan menyarankan Anda untuk tidak mencari alasan untuk tidak mencobanya karena praktik terbaik , rasanya seperti ketika orang berpendapat bahwa OOP tidak diperlukan karena mereka dapat menyiasati pola desain yang kompleks dengan apa yang selalu mereka lakukan dengan paradigma XYZ; Anda bisa mendapatkan keuntungan.
Cobalah, Anda akan melihat bagaimana bekerja di "cabang pribadi" sebenarnya merupakan pilihan yang lebih baik. Salah satu alasan saya dapat mengatakan tentang mengapa yang terakhir adalah benar adalah karena Anda kehilangan rasa takut untuk berkomitmen , memungkinkan Anda untuk melakukan kapan saja Anda mau dan bekerja dengan cara yang lebih alami.
Mengenai "penggabungan neraka", Anda mengatakan "kecuali kami sedang bereksperimen", saya katakan "bahkan jika Anda bereksperimen + memelihara + bekerja di v2.0 yang dirubah pada saat yang sama ". Seperti yang saya katakan sebelumnya, menggabungkan neraka tidak ada, karena:
Juga, ukuran proyek tidak masalah, ketika saya beralih dari subversi saya sebenarnya sudah melihat manfaatnya saat bekerja sendiri, semuanya terasa benar. The changesets (tidak persis revisi, tapi serangkaian tertentu perubahan untuk file tertentu Anda termasuk komit, terisolasi dari negara bagian basis kode) membiarkan Anda memvisualisasikan apa yang Anda maksud dengan melakukan apa yang Anda lakukan untuk kelompok tertentu file, bukan seluruh basis kode.
Mengenai cara kerja perubahan dan peningkatan kinerja. Saya akan mencoba mengilustrasikannya dengan contoh yang ingin saya berikan: proyek mootools beralih dari svn diilustrasikan dalam grafik jaringan github mereka .
Sebelum
Setelah
Apa yang Anda lihat adalah pengembang dapat fokus pada pekerjaan mereka sendiri saat melakukan, tanpa takut melanggar kode orang lain, mereka khawatir akan melanggar kode orang lain setelah mendorong / menarik (DVCS: komit pertama, kemudian tekan / tarik, kemudian perbarui ) tetapi karena penggabungan lebih cerdas di sini, mereka sering tidak pernah melakukan ... bahkan ketika ada konflik penggabungan (yang jarang terjadi), Anda hanya menghabiskan 5 menit atau kurang memperbaikinya.
Rekomendasi saya kepada Anda adalah untuk mencari seseorang yang tahu cara menggunakan mercurial / git dan mengatakan kepadanya untuk menjelaskannya kepada Anda secara langsung. Dengan menghabiskan sekitar setengah jam dengan beberapa teman di baris perintah saat menggunakan lincah dengan desktop kami dan akun bitbucket menunjukkan kepada mereka bagaimana untuk menggabungkan, bahkan membuat konflik bagi mereka untuk melihat bagaimana cara memperbaikinya dalam jumlah waktu yang konyol, saya dapat menunjukkan mereka kekuatan sebenarnya dari sebuah DVCS.
Akhirnya, saya akan merekomendasikan Anda untuk menggunakan bitbucket + mercurial daripada git + github jika Anda bekerja dengan windows guys. Mercurial juga sedikit lebih sederhana, tetapi git lebih kuat untuk manajemen repositori yang lebih kompleks (misalnya git rebase ).
Beberapa bacaan tambahan yang disarankan:
sumber
Apa yang Anda katakan adalah antara lain bahwa jika Anda pada dasarnya tetap di satu cabang, maka Anda tidak perlu kontrol versi terdistribusi.
Itu benar, tetapi bukankah itu pembatasan kuat yang tidak perlu untuk cara Anda bekerja, dan yang tidak skala baik ke beberapa lokasi di beberapa zona waktu? Di mana server pusat subversi berada, dan haruskah semua orang pulang jika server itu karena suatu alasan turun?
DVCSes adalah untuk Subversion, apa Bittorrent adalah untuk ftp
(secara teknis, tidak secara hukum). Mungkin jika Anda memikirkan hal itu, Anda mungkin mengerti mengapa itu adalah lompatan besar ke depan?
Bagi saya, beralih ke git, segera menghasilkan
Jadi, pertimbangkan mengapa bittorrent lebih baik daripada ftp, dan pertimbangkan kembali posisi Anda :)
Catatan: Telah disebutkan bahwa ada kasus penggunaan di mana ftp lebih cepat dan daripada bittorrent. Ini berlaku seperti halnya file cadangan yang dikelola editor favorit Anda lebih cepat digunakan daripada sistem kontrol versi.
sumber
Fitur pembunuh dari sistem kontrol versi terdistribusi adalah bagian terdistribusi. Anda tidak checkout "copy pekerjaan" dari repositori, Anda mengkloning seluruh salinan repositori. Ini sangat besar, karena memberikan manfaat kuat:
Anda dapat menikmati manfaat dari kontrol versi, bahkan ketika Anda tidak memiliki akses internet seperti ...Yang ini sayangnya terlalu sering digunakan dan overhyped sebagai alasan DVCS luar biasa --- itu bukan titik penjualan yang kuat karena banyak kami menemukan diri kami coding tanpa akses internet sesering mulai hujan katak.Alasan sebenarnya memiliki repositori lokal adalah killer adalah bahwa Anda memiliki kendali penuh atas sejarah komit Anda sebelum didorong ke repositori master .
Pernah memperbaiki bug dan berakhir dengan sesuatu seperti:
Dan seterusnya. Sejarah seperti itu berantakan --- hanya ada satu perbaikan, tetapi sekarang implementasinya tersebar di antara banyak komit yang berisi artefak yang tidak diinginkan seperti penambahan dan penghapusan pernyataan debugging. Dengan sistem seperti SVN, alternatifnya adalah tidak melakukan (!!!) sampai semuanya berfungsi untuk menjaga sejarah tetap bersih. Meski begitu, kesalahan lewat dan Hukum Murphy sedang menunggu untuk membuat Anda brutal ketika sejumlah besar pekerjaan tidak dilindungi oleh kontrol versi.
Memiliki klon lokal repositori, yang Anda miliki , memperbaikinya karena Anda dapat menulis ulang sejarah dengan terus-menerus menggulirkan "memperbaikinya" dan "oops" berkomitmen pada komit "perbaikan bug". Pada akhirnya, satu komit bersih akan dikirim ke repositori master yang terlihat seperti:
Begitulah seharusnya.
Kemampuan untuk menulis ulang sejarah bahkan lebih kuat ketika dikombinasikan dengan model percabangan. Seorang pengembang dapat melakukan pekerjaan yang sepenuhnya terisolasi dalam cabang dan kemudian ketika saatnya untuk membawa cabang itu ke bagasi, Anda memiliki segala macam opsi menarik:
Lakukan penggabungan vanila biasa . Membawa semuanya dalam kutil dan semuanya.
Lakukan rebase . Memungkinkan Anda untuk memilah-milah sejarah cabang, mengatur ulang urutan komit, membuang komit, bergabung komit bersama, menulis ulang pesan komit --- bahkan mengedit komit atau menambahkan yang baru! Sistem kontrol versi terdistribusi memiliki dukungan mendalam untuk tinjauan kode.
Setelah saya mengetahui bagaimana repositori lokal memungkinkan saya untuk mengedit sejarah saya demi kewarasan sesama programmer dan masa depan saya sendiri, saya menutup SVN untuk selamanya. Klien Subversion saya sekarang
git svn
.Mengizinkan pengembang dan manajer untuk melakukan kontrol editorial atas hasil sejarah komit dalam sejarah proyek yang lebih baik dan memiliki riwayat bersih untuk bekerja dengan benar-benar membantu produktivitas saya sebagai seorang programmer. Jika semua pembicaraan tentang "menulis ulang sejarah" ini membuat Anda takut, jangan khawatir karena itulah untuk repositori sentral, publik, atau master. Sejarah dapat (dan seharusnya!) Ditulis ulang sampai pada titik di mana seseorang membawanya ke cabang dalam repositori yang menarik orang lain. Pada saat itu sejarah harus diperlakukan seolah-olah diukir di atas loh batu.
sumber
Jawaban dukofgamings mungkin sekitar sebaik yang bisa didapat, tapi saya ingin mendekati ini dari arah yang berbeda.
Mari kita asumsikan bahwa apa yang Anda katakan benar-benar benar, dan bahwa dengan menerapkan praktik-praktik yang baik Anda dapat menghindari masalah yang DVCS dirancang untuk diperbaiki. Apakah ini berarti bahwa DVCS tidak menawarkan keuntungan bagi Anda? Orang bau di mengikuti praktik terbaik. Orang-orang akan kacau. Jadi mengapa Anda menghindari perangkat lunak yang dirancang untuk memperbaiki serangkaian masalah, memilih untuk mengandalkan orang untuk melakukan sesuatu yang dapat Anda prediksi sebelumnya yang tidak akan mereka lakukan?
sumber
Ya, itu menyakitkan ketika Anda harus menggabungkan komit besar dalam subversi. Tetapi ini juga merupakan pengalaman belajar yang hebat, membuat Anda melakukan segala yang mungkin untuk menghindari penggabungan konflik. Dengan kata lain, Anda sering belajar check-in . Integrasi awal adalah hal yang sangat baik untuk proyek yang berlokasi bersama. Selama semua orang melakukan itu, menggunakan subversi seharusnya tidak menjadi masalah.
Git, misalnya, dirancang untuk pekerjaan terdistribusi dan mendorong orang untuk mengerjakan proyek mereka sendiri dan membuat garpu sendiri untuk penggabungan (akhirnya) nanti. Itu tidak secara khusus dirancang untuk integrasi berkelanjutan dalam "tim kecil dan sangat kolaboratif" yang merupakan apa yang diminta OP. Justru sebaliknya, kalau dipikir-pikir itu. Anda tidak akan menggunakan fitur terdistribusi mewah jika semua yang Anda lakukan adalah duduk di ruangan yang sama bekerja sama pada kode yang sama.
Jadi untuk tim yang berlokasi bersama, menggunakan CI, saya benar-benar tidak berpikir itu penting jika Anda menggunakan sistem terdistribusi atau tidak. Itu bermuara pada rasa dan pengalaman.
sumber
Karena Anda harus terus menerus menantang pengetahuan Anda sendiri. Anda suka subversi, dan saya bisa mengerti karena saya menggunakannya selama bertahun-tahun, dan sangat senang tentang hal itu, tetapi itu tidak berarti bahwa itu masih alat yang paling cocok untuk Anda.
Saya percaya bahwa ketika saya mulai menggunakannya, itu adalah pilihan terbaik saat itu. Tetapi alat lain muncul seiring waktu, dan sekarang saya lebih suka git, bahkan untuk proyek waktu luang saya sendiri.
Dan subversi memang memiliki beberapa kekurangan. Misal, jika Anda mengganti nama direktori pada disk, maka direktori tersebut tidak diganti namanya di repositori. Pemindahan file tidak didukung, membuat file memindahkan operasi penyalinan / penghapusan, membuat penggabungan perubahan saat file telah dipindahkan / diganti namanya menjadi sulit. Dan pelacakan gabungan tidak benar-benar membangun ke dalam sistem, melainkan diimplementasikan dalam bentuk solusi.
Git memang memecahkan masalah ini (termasuk mendeteksi secara otomatis jika suatu file telah dipindahkan, Anda bahkan tidak perlu mengatakan itu adalah fakta).
Di sisi lain git tidak memungkinkan Anda untuk bercabang pada level direktori individual seperti halnya subversi.
Jadi jawaban saya adalah, Anda harus menyelidiki alternatif, melihat apakah itu sesuai dengan kebutuhan Anda lebih baik daripada apa yang Anda kenal, dan kemudian memutuskan.
sumber
Sehubungan dengan kinerja, Git atau DVCS lainnya memiliki keuntungan besar dibandingkan SVN ketika Anda harus beralih dari satu cabang ke cabang lain, atau untuk beralih dari satu revisi ke yang lain. Karena semuanya disimpan secara lokal, banyak hal lebih cepat daripada untuk SVN.
Ini saja bisa membuat saya beralih!
sumber
Alih-alih berpegang pada gagasan bahwa "dengan menerapkan praktik terbaik Anda tidak memerlukan DVCS", mengapa tidak mempertimbangkan bahwa alur kerja SVN adalah satu alur kerja, dengan satu set praktik terbaik, dan alur kerja GIT / Hg adalah alur kerja yang berbeda, dengan serangkaian praktik terbaik yang berbeda.
git bisect
(dan semua implikasinya pada repositori utama Anda)Di Git, prinsip yang sangat penting adalah Anda dapat menemukan bug menggunakan
git bisect
. Untuk melakukan ini, Anda mengambil versi terakhir yang Anda jalankan yang diketahui berfungsi, dan versi pertama yang Anda jalankan ternyata gagal, dan Anda melakukan (dengan bantuan Git) pencarian biner untuk mencari tahu komit yang menyebabkan bug. Untuk melakukan ini, seluruh riwayat revisi Anda harus relatif bebas dari bug lain yang dapat mengganggu pencarian bug Anda (percaya atau tidak, ini sebenarnya bekerja cukup baik dalam praktiknya, dan pengembang kernel Linux melakukan ini sepanjang waktu).Untuk mencapai
git bisect
kapabilitas, Anda mengembangkan fitur baru di cabang fitur sendiri , rebase dan bersihkan riwayatnya (sehingga Anda tidak memiliki revisi yang tidak berfungsi dalam riwayat Anda - hanya sekelompok perubahan yang masing-masing membuat Anda mengambil jalan tengah untuk memperbaiki masalah), dan kemudian ketika fitur selesai, Anda menggabungkannya ke cabang utama dengan riwayat kerja.Juga, untuk membuat ini berfungsi, Anda harus memiliki disiplin tentang versi cabang utama tempat Anda memulai cabang fitur Anda. Anda tidak bisa hanya memulai dari kondisi
master
cabang saat ini karena mungkin ada bug yang tidak terkait - jadi saran dalam komunitas kernel adalah mulai bekerja dari versi stabil terbaru dari kernel (untuk fitur besar), atau untuk mulai bekerja dari calon rilis yang diberi tag terbaru.Anda juga dapat mencadangkan kemajuan perantara Anda dengan mendorong cabang fitur ke server, dan Anda dapat mendorong cabang fitur ke server untuk membaginya dengan orang lain dan memperoleh umpan balik, sebelum fitur selesai, sebelum Anda harus ubah kode menjadi fitur permenant dari basis kode yang harus dihadapi semua orang * dalam proyek Anda.
The gitworkflows Halaman manusia adalah pengenalan yang baik untuk alur kerja yang Git dirancang untuk. Juga Mengapa Git Lebih Baik daripada X membahas alur kerja git.
Proyek besar dan terdistribusi
Karena dalam proyek-proyek seperti Linux, ada begitu banyak orang yang terlibat yang terdistribusi secara geografis sehingga sulit untuk berkolaborasi dengan tim kecil yang berbagi ruang konferensi. (Saya menduga bahwa untuk mengembangkan produk besar seperti Microsoft Windows yang bahkan jika orang-orang semua berada di gedung yang sama, tim ini terlalu besar untuk mempertahankan tingkat kolaborasi yang membuat VCS yang terpusat bekerja tanpa penolong.)
sumber
Mengapa tidak menggunakannya bersama-sama? Pada proyek saya saat ini, kami terpaksa menggunakan CVS. Namun, kami juga menyimpan repositori git lokal untuk melakukan pengembangan fitur. Ini adalah yang terbaik dari kedua dunia karena Anda dapat mencoba berbagai solusi dan menyimpan versi dari apa yang sedang Anda kerjakan, pada mesin Anda sendiri. Ini memungkinkan Anda untuk mengembalikan fitur versi sebelumnya atau mencoba beberapa pendekatan tanpa masalah saat Anda mengacaukan kode Anda. Memiliki repositori sentral kemudian memberi Anda manfaat memiliki repositori terpusat.
sumber
Saya tidak punya pengalaman pribadi dengan DVCS, tetapi dari apa yang saya kumpulkan dari jawaban di sini dan beberapa dokumen terkait, perbedaan paling mendasar antara DVCS dan CVCS adalah model kerja yang digunakan
DVCS
Model kerja DVCS adalah Anda melakukan pengembangan yang terisolasi . Anda sedang mengembangkan fitur baru / perbaikan bug Anda secara terpisah dari semua perubahan lain sampai saat Anda memutuskan untuk merilisnya ke seluruh tim. Hingga saat itu, Anda dapat melakukan check-in apa pun yang Anda suka, karena tidak ada orang lain yang akan terganggu dengan hal itu.
CVCS
Model kerja CVCS (khususnya Subversion) adalah Anda melakukan pengembangan kolaboratif . Anda sedang mengembangkan fitur baru / perbaikan bug Anda dalam kolaborasi langsung dengan semua anggota tim lainnya dan semua perubahan segera tersedia untuk semua.
Perbedaan lainnya
Perbedaan lain antara
svn
dangit
/hg
, seperti revisi vs perubahan adalah kebetulan. Sangat mungkin untuk membuat DVCS berdasarkan revisi (seperti Subversion memilikinya) atau CVCS berdasarkan pada perubahan (seperti yang dilakukan Git / Mercurial).Saya tidak akan merekomendasikan alat tertentu, karena sebagian besar tergantung pada model kerja yang Anda (dan tim Anda) paling nyaman dengannya.
Secara pribadi, saya tidak punya masalah dengan bekerja dengan CVCS.
svn
dangit
/hg
. Sebagai contoh, V2 dari beberapa perangkat lunak dikelola oleh tim yang berbeda, menggunakan VCS yang berbeda, sementara kami mengembangkan V3. Kadang-kadang, perbaikan bug harus diimpor dari V2 VCS ke V3 VCS, yang pada dasarnya berarti melakukan check-in yang sangat besar pada V3 VCS (dengan semua perbaikan bug dalam satu set perubahan). Saya tahu itu tidak ideal, tetapi itu adalah keputusan manajemen untuk menggunakan sistem VCS yang berbeda.sumber