Saya telah menggunakan Git di dua perusahaan terakhir saya untuk kontrol versi. Tampaknya dari apa yang saya dengar bahwa sekitar 90% perusahaan menggunakan Git dibandingkan sistem kontrol versi lainnya.
Salah satu nilai jual terbesar dari Git adalah desentralisasi, yaitu semua repositori adalah sama; tidak ada pusat penyimpanan / sumber kebenaran. Ini adalah fitur yang diperjuangkan Linus Torvalds .
Tetapi tampaknya setiap perusahaan menggunakan Git secara terpusat, seperti halnya yang menggunakan SVN atau CVS. Selalu ada repositori pusat di server (biasanya di GitHub) yang orang tarik dan dorong. Saya belum pernah melihat atau mendengar tentang (dalam pengalaman saya yang diakui terbatas) orang menggunakan Git dengan cara yang benar-benar terdesentralisasi di mana ia dimaksudkan, yaitu mendorong dan menarik ke repositori rekan kerja lain yang mereka anggap cocok.
Pertanyaan saya adalah:
- Mengapa orang tidak menggunakan alur kerja terdistribusi untuk Git dalam praktiknya?
- Apakah kemampuan untuk bekerja secara terdistribusi bahkan penting untuk kontrol versi modern, atau apakah itu terdengar bagus?
Sunting
Saya menyadari bahwa saya tidak menemukan nada yang benar dalam pertanyaan awal saya. Kedengarannya seperti saya bertanya mengapa ada orang yang bekerja secara terpusat ketika sistem kontrol versi terdistribusi (DVCS) jelas lebih unggul. Sebenarnya, yang ingin saya katakan adalah, saya tidak melihat manfaat apa pun bagi DVCS . Namun saya sering mendengar orang mengabarkan keunggulannya, sementara dunia nyata tampaknya setuju dengan pandangan saya.
sumber
Jawaban:
Ahh, tapi sebenarnya Anda sedang menggunakan git secara desentralisasi!
Mari kita bandingkan pendahulu git di mindshare, svn. Subversi hanya memiliki satu "repo", satu sumber kebenaran. Ketika Anda melakukan komit, itu untuk repo tunggal pusat, yang juga dilakukan oleh setiap pengembang lainnya.
Jenis pekerjaan ini berhasil, tetapi menyebabkan banyak masalah, yang terbesar adalah konflik gabungan yang ditakuti . Ini ternyata ada di mana saja dari menjengkelkan ke mimpi buruk untuk menyelesaikan. Dan dengan satu sumber kebenaran, mereka memiliki kebiasaan buruk untuk menghentikan pekerjaan semua orang sampai mereka terselesaikan. Menggabungkan konflik tentu ada dengan git, tetapi itu bukan kejadian yang menghentikan pekerjaan dan jauh lebih mudah dan lebih cepat untuk diselesaikan; mereka umumnya hanya memengaruhi pengembang yang terlibat dengan perubahan yang bertentangan, bukan semua orang.
Lalu ada seluruh titik kegagalan, dan masalah yang menyertainya. Jika repo pusat svn Anda mati, Anda semua kacau sampai dapat dikembalikan dari cadangan, dan jika tidak ada cadangan, Anda semua kacau dua kali lipat. Tetapi jika git repo "sentral" mati, Anda dapat memulihkan dari cadangan, atau bahkan dari salah satu salinan repo lain yang ada di server CI, workstation pengembang, dll. Anda dapat melakukan ini dengan tepat karena didistribusikan, dan setiap pengembang memiliki salinan repo kelas satu.
Di sisi lain, karena repo git Anda adalah repo kelas satu dengan haknya sendiri, ketika Anda berkomitmen, komit Anda pergi ke repo lokal Anda. Jika Anda ingin membaginya dengan orang lain, atau ke sumber kebenaran pusat, Anda harus secara eksplisit melakukan ini dengan mendorong ke remote. Pengembang lain kemudian dapat menarik ke bawah perubahan itu ketika nyaman bagi mereka, daripada harus memeriksa svn terus-menerus untuk melihat apakah seseorang melakukan sesuatu yang akan mengacaukannya.
Fakta bahwa, alih-alih mendorong langsung ke pengembang lain, Anda mendorong perubahan ke mereka secara tidak langsung melalui repo jarak jauh lain, tidak terlalu menjadi masalah. Bagian penting dari perspektif kami adalah salinan lokal repo Anda adalah repo sendiri. Dalam svn, sumber kebenaran sentral ditegakkan oleh desain sistem. Dalam git, sistem bahkan tidak memiliki konsep ini; jika ada sumber kebenaran, itu diputuskan secara eksternal.
sumber
svn up
up to date dengan repo sebelum Anda dapat check-in. Ketika orang lain terus memeriksa saat Anda sedang mencoba untuk menyelesaikan menggabungkan konflik, dan memberikan lain set menggabungkan konflik ... Anda baik menghentikan bahwa atau Anda kehilangan apa yang tersisa dari kewarasan Anda.Ketika Anda membangun server (Anda sedang menggunakan CI, kan?) Menciptakan membangun, mana itu menarik dari? Tentu, membangun integrasi yang Anda dapat berargumen tidak perlu "satu repo yang benar" tetapi pasti membangun distribusi (yaitu apa yang Anda berikan kepada pelanggan).
Dengan kata lain: fragmentasi. Jika Anda menetapkan satu repo sebagai "repo" dan menunjuk wali yang memeriksakan permintaan, Anda memiliki cara mudah untuk memenuhi permintaan "beri saya perangkat lunak" atau "Saya baru di tim, di mana kodenya?"
Kekuatan DVCS bukan terletak pada aspek peer-to-peer, tetapi fakta bahwa itu adalah hierarkis . Saya memodifikasi ruang kerja saya, lalu saya komit ke lokal. Setelah saya memiliki fitur yang lengkap, saya menggabungkan komit saya dan mendorong mereka ke remote saya. Lalu siapa pun dapat melihat kode sementara saya, memberikan umpan balik, dll. Sebelum saya membuat permintaan tarik dan admin proyek menggabungkannya ke dalam repo One True.
Dengan CVCS tradisional Anda berkomitmen atau tidak. Itu bagus untuk beberapa alur kerja (saya menggunakan kedua jenis VCS untuk proyek yang berbeda), tetapi jatuh pada wajahnya untuk proyek publik atau OSS. Kuncinya adalah DVCS memiliki beberapa langkah, yang lebih banyak berfungsi, tetapi memberikan cara yang lebih baik untuk mengintegrasikan kode dari orang asing melalui proses bawaan yang memungkinkan visibilitas yang lebih baik ke dalam apa yang sedang diperiksa. Menggunakannya secara terpusat berarti Anda masih bisa memiliki standar emas dari keadaan proyek saat ini sambil juga menyediakan mekanisme pembagian kode yang lebih baik.
sumber
Saya tidak tahu bagaimana Anda mendefinisikan "semua orang", tetapi tim saya memiliki "repo sentral di server" dan juga dari waktu ke waktu kami menarik dari repo kolega lain tanpa melalui repo pusat itu. Ketika kita melakukan ini, kita masih pergi melalui server, karena kita memilih untuk tidak mengirim email tentang tempat itu, tetapi tidak melalui repo pusat. Ini umumnya terjadi ketika suatu kelompok berkolaborasi pada fitur tertentu dan ingin tetap up to date dengan satu sama lain, tetapi belum tertarik untuk menerbitkan fitur tersebut kepada semua orang. Tentu saja karena kami bukan pekerja silo yang tertutup, situasi itu tidak berlangsung lama, tetapi DVCS memberikan fleksibilitas untuk melakukan apa pun yang paling nyaman. Kami dapat menerbitkan cabang fitur atau tidak sesuai selera.
Tapi 90% lebih dari waktu, tentu, kami pergi melalui repo pusat. Ketika saya tidak peduli dengan perubahan tertentu atau pekerjaan kolega tertentu itu lebih mudah, dan itu skala yang lebih baik, untuk menarik "semua perubahan kolega saya yang telah diperiksa dalam repo pusat", daripada secara terpisah menarik perubahan dari masing-masing N kolega. DVCS tidak mencoba untuk mencegah "pull from main repo" menjadi alur kerja yang paling umum, itu mencoba untuk mencegahnya menjadi satu-satunya alur kerja yang tersedia.
"Terdistribusi" berarti bahwa semua repo secara teknis setara sejauh menyangkut
git
perangkat lunak, tetapi tidak berarti bahwa semua repo memiliki arti yang sama sejauh menyangkut pengembang dan alur kerja kami. Ketika kami merilis ke klien atau ke server produksi, repo yang kami gunakan untuk melakukan itu memiliki arti yang berbeda dari repo yang hanya digunakan oleh satu pengembang di laptop mereka.Jika "benar-benar desentralisasi" berarti "tidak ada repo khusus" maka saya tidak berpikir itu yang Linus berarti juara, mengingat bahwa dalam kenyataannya ia tidak mempertahankan repo khusus yang berada lebih penting dalam skema besar hal, daripada beberapa tiruan acak dari Linux yang saya buat kemarin dan berencana untuk digunakan hanya untuk mengembangkan beberapa tambalan kecil dan kemudian menghapusnya begitu dia menerima tambalan tersebut.
git
tidak istimewa repo di atas saya, tapi Linus tidak istimewa itu. "Nya adalah kondisi Linux saat ini", milikku tidak. Jadi secara alami perubahan cenderunguntuk pergi melalui Linus. Kekuatan DVCS atas VCS terpusat bukanlah bahwa tidak boleh ada pusat de facto, itu adalah bahwa perubahan tidak harus melalui pusat apa pun karena (konflik mengizinkan) siapa pun dapat menggabungkan apa pun.Sistem DVCS juga dipaksakan , karena terdesentralisasi, untuk menyediakan fitur nyaman tertentu berdasarkan fakta bahwa Anda harus memiliki riwayat lengkap (yaitu repo) secara lokal untuk melakukan apa pun. Tetapi jika Anda memikirkannya, tidak ada alasan mendasar mengapa Anda tidak dapat mengonfigurasi VCS terpusat dengan cache lokal yang membuat seluruh riwayat operasi read-only diizinkan kedaluwarsa (saya pikir Perforce memiliki opsi untuk mode ini, tapi saya tidak pernah menggunakan Perforce). Atau pada prinsipnya Anda dapat mengkonfigurasi
git
dengan Anda.git/
direktori pada sistem file yang dipasang jarak jauh untuk meniru "fitur" dari SVN yang tidak berfungsi ketika Anda tidak memiliki koneksi jaringan. Akibatnya, DVCS memaksa pipa ledeng menjadi lebih kuat daripada yang bisa Anda dapatkan dengan VCS terpusat. Ini adalah efek samping (sangat disambut) dan membantu memotivasi desain DVCS, tetapi distribusi tanggung jawab di tingkat teknis ini tidak sama dengan desentralisasi penuh semua tanggung jawab manusia .sumber
Hal yang menarik tentang sifat DVCS, adalah jika orang lain menggunakannya secara terdistribusi, Anda mungkin tidak akan mengetahuinya kecuali mereka berinteraksi langsung dengan Anda. Satu-satunya hal yang dapat Anda katakan secara pasti adalah bahwa Anda dan rekan tim langsung Anda tidak menggunakan git dengan cara ini. Ini tidak memerlukan kebijakan di seluruh perusahaan. Jadi saya akan bertanya, mengapa Anda tidak menggunakan git secara desentralisasi?
Untuk mengatasi hasil edit Anda, mungkin Anda perlu beberapa pengalaman bekerja dengan kontrol versi terpusat yang sebenarnya untuk menghargai perbedaan, karena meskipun mereka tampak halus, mereka meresap. Ini semua adalah hal yang sebenarnya dilakukan oleh tim saya di tempat kerja yang tidak dapat kami lakukan ketika kami memusatkan VCS:
Dengan risiko terdengar tua karena mengatakannya, Anda benar-benar tidak tahu betapa mudahnya Anda memilikinya.
sumber
Saya pikir pertanyaan Anda berasal dari pola pikir (dimengerti) selalu terhubung . yaitu server ci 'kebenaran' pusat selalu (atau dekat selalu) tersedia. Walaupun ini benar di sebagian besar lingkungan, saya telah bekerja di setidaknya satu yang jauh dari ini.
Sebuah proyek Simulasi Militer yang tim saya kerjakan beberapa tahun lalu. Semua kode (Kita berbicara dengan basis kode> US $ 1b) harus (berdasarkan hukum / perjanjian internasional, laki-laki berjas gelap datang jika Anda tidak) berada di mesin yang secara fisik terisolasi dari koneksi Internet apa pun . Ini berarti situasi yang biasa kita masing-masing memiliki 2 PC, satu untuk menulis / menjalankan / menguji kode, yang lain untuk hal-hal Google, memeriksa Email dan semacamnya. Dan ada jaringan lokal di dalam tim mesin-mesin ini, jelas tidak dengan cara apa pun terhubung ke Internet.
"Sumber kebenaran pusat" adalah sebuah mesin di pangkalan militer, di sebuah ruangan tanpa jendela semua-cinderblock bawah tanah (gedung bertulang, yada-yada). Mesin itu juga tidak memiliki koneksi internet.
Secara berkala, itu akan menjadi tugas seseorang untuk mengangkut (secara fisik) berkendara dengan git repo (berisi semua perubahan kode kami) ke pangkalan militer - yang berjarak beberapa ratus kilometer jauhnya, jadi, dapat Anda bayangkan.
Selain itu, dalam sistem yang sangat besar di mana Anda memiliki banyak tim. Mereka umumnya masing-masing akan memiliki repo "sentral" mereka sendiri, yang kemudian kembali ke repo sentral "sentral" yang sebenarnya. Saya tahu setidaknya 1 kontraktor lain yang melakukan git repo dasbor hard-drive yang sama dengan kode mereka juga.
Juga, jika Anda mempertimbangkan sesuatu pada skala kernel Linux ... Pengembang tidak hanya mengirim permintaan tarik ke Linus sendiri. Ini pada dasarnya adalah hierarki repo - yang masing-masing adalah "sentral" bagi seseorang / beberapa tim.
Sifat terputus dari git berarti dapat digunakan di lingkungan di mana alat kontrol sumber model yang terhubung ( yaitu SVN, untuk satu) tidak dapat digunakan - atau tidak dapat digunakan dengan mudah.
sumber
Pada akhirnya, Anda sedang membangun suatu produk. Produk ini mewakili kode Anda pada satu titik waktu. Karena itu, kode Anda harus menyatu di suatu tempat . Titik alami adalah server ci atau server pusat dari mana produk dibangun, dan masuk akal bahwa titik pusat ini adalah repositori git.
sumber
Aspek terdistribusi dari DVCS muncul dalam pengembangan sumber terbuka sepanjang waktu, dalam bentuk forking. Sebagai contoh, beberapa proyek yang saya berkontribusi ditinggalkan oleh penulis asli dan sekarang memiliki banyak percabangan di mana pengelola terkadang menarik fitur tertentu dari satu sama lain. Bahkan secara umum, proyek OSS mengambil kontribusi dari luar melalui permintaan tarik, bukan dengan memberikan orang secara acak mendorong akses ke repo ground-truth.
Ini bukan kasus penggunaan yang sangat umum ketika membangun produk konkret dengan rilis resmi spesifik, tetapi di dunia F / OSS itu adalah norma, bukan pengecualian.
sumber
Kami belum pernah bertemu, bagaimana bisa Anda mengatakan semua orang? ;)
Kedua, ada lebih banyak fitur lain yang Anda temukan di Git tetapi tidak di CVS atau SVN. Mungkin hanya Anda dengan asumsi bahwa ini harus menjadi satu - satunya fitur untuk semua orang .
Tentu banyak orang dapat menggunakannya secara terpusat seperti CVS atau SVN. Tapi jangan lupa fitur lain yang secara inheren datang dengan VCS yang terditribusi: semua salinan lebih atau kurang "lengkap" (semua cabang dan riwayat lengkap tersedia) dan semua cabang dapat diperiksa tanpa terhubung ke server.
Saya berpendapat ini adalah fitur lain yang tidak boleh dilupakan.
Meskipun Anda tidak dapat melakukan ini dengan CVS dan SVN di luar kotak, Git dapat digunakan secara terpusat seperti yang sebelumnya tanpa masalah.
Jadi saya bisa melakukan perubahan saya, mungkin squash work-in-progress melakukan bersama, lalu mengambil dan memulai kembali pekerjaan saya ke cabang pengembangan utama.
Fitur lain yang keluar dari kotak dengan Git:
Lihat juga tiga tabel ini di Wikipedia - Perbandingan perangkat lunak kontrol versi :
fitur
Perintah dasar
Perintah lanjutan
Jadi sekali lagi, mungkin cara yang terdesentralisasi bukan hanya fitur yang membuat orang menggunakannya.
Siapa pun yang berkontribusi atau meng-hosting proyek yang lebih besar di Bitbucked, GitHub dll. Akan melakukannya dengan tepat. Para pengelola menyimpan repositori "utama", klon kontributor, melakukan dan kemudian mengirimkan permintaan penarikan.
Di perusahaan, bahkan dengan proyek atau tim kecil, alur kerja terdistribusi adalah pilihan ketika mereka melakukan outsourcing modul dan tidak ingin eksternal untuk memodifikasi cabang pengembangan suci tanpa perubahan mereka ditinjau sebelumnya.
Seperti biasa: itu tergantung pada persyaratan.
Gunakan VCS terdesentralisasi jika ada poin yang berlaku:
git init .
akan cukup untuk siap untuk versi sesuatu)Ada beberapa lagi tetapi empat sudah cukup.
Tentu saja kedengarannya bagus - untuk pemula.
sumber
svn init
di beberapa titik?Fleksibilitas adalah kutukan sekaligus berkah. Dan seperti Git sangat fleksibel, hampir selalu jauh terlalu fleksibel untuk situasi khas. Secara khusus, sebagian besar proyek Git bukan Linux.
Sebagai hasilnya, pilihan cerdas adalah menghapus sebagian dari fleksibilitas teoretis tersebut ketika mengimplementasikan Git. Secara teori repositori dapat membentuk grafik apa pun, dalam praktiknya pilihan yang biasa adalah pohon. Kita dapat melihat manfaat yang jelas menggunakan teori grafik: di pohon repositori, setiap dua repositori berbagi persis satu leluhur. Dalam grafik acak, gagasan tentang leluhur bahkan tidak ada!
Namun klien git Anda hampir pasti default ke model "leluhur tunggal". Dan grafik di mana node memiliki leluhur tunggal (kecuali untuk node root) adalah pohon. Jadi klien git Anda sendiri default ke model tree, dan karenanya repositori terpusat.
sumber
Logika bisnis menghargai server yang terpusat. Untuk hampir semua skenario bisnis yang realistis, server terpusat adalah fitur mendasar dari alur kerja.
Hanya karena Anda memiliki kapasitas untuk melakukan DVCS, bukan berarti alur kerja utama Anda adalah DVCS. Ketika saya menggunakan git di tempat kerja, kami menggunakannya secara terpusat, kecuali untuk kasus aneh aneh di mana bit yang didistribusikan sangat penting untuk menjaga hal-hal bergerak bersama.
Sisi terdistribusi adalah rumit. Biasanya Anda ingin menjaga semuanya lancar dan mudah. Namun, dengan menggunakan git Anda memastikan bahwa Anda memiliki akses ke sisi terdistribusi untuk menangani situasi degil yang mungkin timbul di jalan.
sumber
Untuk seorang rekan kerja untuk menarik dari repo git pada mesin saya berarti saya perlu memiliki daemon git berjalan di tingkat root sebagai tugas latar belakang. Saya sangat curiga terhadap daemon yang berjalan di komputer saya sendiri, atau di laptop yang disediakan perusahaan saya. Solusi termudah adalah "TIDAK"! Bagi seorang rekan kerja untuk menarik dari repo git pada komputer saya juga berarti alamat internet saya perlu diperbaiki. Saya bepergian, saya bekerja dari rumah, dan saya kadang-kadang bekerja dari kantor saya.
Di sisi lain, VPNing ke situs perusahaan dan mendorong cabang ke repo pusat membutuhkan waktu kurang dari satu menit. Saya bahkan tidak perlu VPN jika saya di kantor. Rekan kerja saya dapat dengan mudah menarik dari cabang itu.
Di pihak ketiga, repo git lokal saya adalah repositori berfitur lengkap. Saya dapat melakukan pekerjaan baru, membuat cabang baru untuk pekerjaan eksperimental, dan mengembalikan pekerjaan ketika saya mengacaukan banyak hal, bahkan ketika saya sedang bekerja di pesawat terbang dengan ketinggian 30.000 kaki di tengah-tengah dari mana. Coba lakukan itu dengan sistem kontrol versi terpusat.
sumber
Kompleksitas:
Dengan repositori pusat, alur kerja khas mungkin
Kompleksitas sehubungan dengan jumlah pengembang di O (1).
Jika sebaliknya masing-masing pengembang memiliki cabang utama sendiri, untuk pengembang 0:
Pendekatan peer-to-peer adalah O (N).
Konsistensi:
Sekarang pertimbangkan jika ada konflik gabungan antara cabang utama Alice dan cabang utama Bob. Setiap pengembang N dapat menyelesaikan konflik secara berbeda. Hasil: kekacauan. Ada cara untuk mencapai konsistensi akhirnya, tetapi sampai itu terjadi, semua jenis waktu pengembang dapat terbuang sia-sia.
sumber
Sederhana:
Perusahaan adalah organisasi yang terpusat, dengan alur kerja yang terpusat.
Setiap programmer memiliki bos dan bosnya, dll hingga CTO. CTO adalah sumber utama kebenaran teknis. Apa pun alat yang digunakan perusahaan, itu harus mencerminkan rantai komando ini. Sebuah perusahaan seperti tentara - Anda tidak bisa membiarkan prajurit mengalahkan seorang jenderal.
GIT menawarkan fitur yang berguna bagi perusahaan (mis. Menarik permintaan untuk meninjau kode) dan itu saja membuat mereka beralih ke GIT. Bagian desentralisasi hanyalah fitur yang tidak mereka butuhkan - sehingga mereka mengabaikannya.
Untuk menjawab pertanyaan Anda: Bagian yang didistribusikan memang unggul dalam lingkungan terdistribusi, misalnya sumber terbuka. Hasil bervariasi tergantung pada siapa yang berbicara. Linus Torvalds sebenarnya bukan tikus bilik Anda, itu sebabnya fitur berbeda dari GIT penting baginya daripada untuk perusahaan github-centric Anda.
sumber
Mungkin itu karena pemrosesan penggajiannya terpusat, jadi kita harus membuat orang pusat senang jika kita ingin dibayar.
Mungkin itu karena kami menciptakan satu produk, jadi kami membutuhkan salinan utama perangkat lunak untuk pelanggan.
Mungkin itu karena jauh lebih mudah bagi seorang programmer untuk pergi ke satu tempat untuk mendapatkan perubahan semua orang, daripada harus terhubung ke banyak mesin yang berbeda.
Mungkin itu karena database bug terpusat, dan harus tetap disinkronkan dengan kode .
Terpusat itu bagus, sampai ada masalah .....
Git menjadi sistem terdistribusi memungkinkan pusat baru dibuat dengan biaya rendah dari repositori terkini (cukup tampilkan repositori ke jaringan). Git juga memungkinkan cadangan yang kedaluwarsa diperbarui dari repositori pada mesin pengembang, sehingga membuatnya lebih mudah untuk memulihkan pusat.
Mampu melakukan penggabungan dll pada salinan lokal dari repositori ketika jaringan sedang buruk, tetapi tidak memerlukan sistem terdistribusi; itu hanya membutuhkan sistem yang menyimpan salinan lokal dari semua data. Begitu juga dengan memeriksa kode dengan terbang dll.
Pada akhirnya, ada sedikit biaya untuk didistribusikan dan beberapa manfaat. Sebagian besar biaya distribusi ada di area yang diperlukan jika Anda ingin pelacakan cabang yang bagus, dll. Jika Anda merancang sistem untuk digunakan di sebagian besar perusahaan, Anda tidak akan mendesainnya untuk didistribusikan, karena kontrol terpusat dari kode sumber jelas merupakan "kasus penggunaan" utama.
sumber