Apakah Ada Cacat Dengan Model Cabang Git Ini?


10

Saya bertanya tentang model percabangan git ini atau alur kerja. Saya sangat menyukai ini. Itu menurut saya sangat intuitif dan produktif, tetapi yang saya minta adalah apakah ada kekurangan atau negatif pada pendekatan ini yang belum jelas bagi saya (datang dari dunia lain di mana ClearCase memerintah hari itu).

(Anda tidak perlu menjawab setiap pertanyaan, apa pun yang Anda bisa dapat membantu)

  1. Apakah Anda menggunakan ini atau alur kerja percabangan git yang serupa?

  2. Apakah Anda menganggap ini pendekatan yang produktif?

  3. Apakah Anda melihat ada kekurangan dengan pendekatan ini? Adakah potensi penurunan?

  4. Jika Anda memiliki pendekatan yang lebih baik, maukah Anda berbagi, atau memberikan tautan ke artikel atau diskusi tentangnya?

Jawaban:


6

Sebagian besar, ini adalah alur kerja yang biasa digunakan dengan VCS apa pun yang telah kami gunakan sejauh ini. Dengan beberapa (CVS, SVN) itu lebih sulit dilakukan, dengan GIT itu sepele. Yang mengatakan, saya punya dua komentar:

Pertama, ada dua aliran pemikiran ketika datang ke cabang fitur:

  1. Gabungkan mereka
  2. Rebase mereka

(1) adalah apa yang tampaknya disarankan artikel. Masalah dengan komit gabungan disebut Evil Merge . Khususnya, mereka yang bergabung dengan jalur pengembangan di mana fungsi telah mengubah semantik di salah satu cabang, tetapi penggabungan otomatis gagal untuk menambal semua kejadian dalam kode yang berasal dari cabang lain. Regresi yang diperkenalkan dengan cara itu terkenal sulit untuk di-debug. Sebagai pengguna GIT, Anda biasanya bisa lebih santai tentang regresi, karena Anda harus git bisectmenemukan penyebabnya untuk Anda secara otomatis. Namun, dalam situasi yang dijelaskan, git bisectakan menunjukkan komit gabungan, yang tidak membantu Anda sama sekali.

(2) menghindari masalah ini dengan mencoba mempertahankan sejarah linier mungkin. Orang-orang yang menentang rebounds mengklaim itu membatalkan pengujian apa pun yang mungkin Anda lakukan sebelum rebase.

Secara pribadi, saya tegas di camp (2), karena saya menilai validitas git bisecthasil lebih dari potensi hilangnya cakupan tes, yang mudah dikompensasi dengan menggunakan sistem CI yang tepat.

Kedua, saya telah memutuskan untuk saya bahwa mendorong antar pengembang jarang merupakan ide yang bagus. Ada masalah keamanan yang terlibat dalam memungkinkan semua orang masuk ke kotak Anda untuk mengambil, atau menjalankan git-deamon secara lokal, dan, yang lebih penting, dalam tim yang tidak terlalu kecil, pengawasan dapat hilang dengan cepat.

Yang mengatakan, saya semua mendukung repositori pementasan (kadang-kadang juga disebut awal ), yang memungkinkan subteams untuk berbagi pekerjaan mereka dalam proses melalui server pusat yang, bagaimanapun, berbeda dari yang utama (sering ke luar- menghadap, jika tidak publik). Biasanya, setiap subteam akan mempertahankan satu cabang topik untuk dirinya sendiri, dan sistem CI akan melakukan penggabungan gurita periodik dari semua cabang topik menjadi satu cabang integrasi besar, mengeluh tentang konflik dan membangun kesalahan.


+1, tidak pernah mendengar tentang repositori pementasan yang disebut sebagai awal tapi saya bayangkan itu berasal dari "mulai dari awal" :-)
Spoike

@ReinHenrichs: bisakah kamu tetap tenang dan berdebat tentang mengapa kamu tidak setuju dengan rebasing
CharlesB

2
Maaf. Masalah git bisect yang diklaim tidak ada. Git bisect dapat membagi dua menjadi gabungan komit. Sejarah linier menjadi sulit dipertahankan karena jumlah pengembang (atau cabang topikal) meningkat. Selain itu, dengan tidak bercabang dan bergabung, Anda kehilangan alat alur kerja yang sangat kuat dan salah satu manfaat utama menggunakan git. Anda tidak harus "mendorong antar pengembang", Anda dapat mengatur repositori publik yang jauh (di dalam tim pengembang, setidaknya) untuk setiap pengembang. Sangat mudah untuk melakukannya. Apa yang Anda gambarkan pada dasarnya adalah menggunakan git seperti svn.
Rein Henrichs

"gabungan jahat" dicegah secara rapi dengan menjalankan tes . Penggabungan berkomitmen menyediakan metadata yang berguna. Saya tidak yakin apa pengalaman OP mempertahankan repositori git dengan sejumlah besar cabang topikal. Kami mencoba strategi "rebase dan ratakan" dengan proyek sumber terbuka dengan ratusan cabang topikal dan hancur karena kerumitan. Kami beralih ke strategi penggabungan dan menghapus semua kerumitan sambil menambahkan utilitas tanpa mengalami segala kekurangan yang seharusnya. git bisectdiberikan sebagai alasan untuk menjaga strategi flat itu juga.
Rein Henrichs

1
@ReinHenrichs "Gabungan jahat" yang digambarkan mmutz tidak ada hubungannya dengan git bisectsendirian. Ini terjadi ketika fitur A mengubah fungsi yang juga digunakan fitur B. Semua tes akan lulus di kedua A dan B sebelum penggabungan, tetapi setelah tes penggabungan dapat pecah karena perubahan yang tidak kompatibel antara A dan B - tetapi git bisecttidak dapat sebagian menerapkan satu cabang ke yang lain, jadi satu-satunya petunjuk adalah bahwa gabungan menggabungkan adalah saat bug diperkenalkan.
Izkata

2

Saat ini saya sedang dalam proses melakukan refactoring besar-besaran dan lama (mengubah aplikasi dari satu ke perangkat GUI lainnya) dan melakukan alur kerja sentase-sentris yang sukses, karena anggota tim lainnya terus bekerja pada fitur-fitur baru:

Sebagian besar ada dua cabang utama, di mastermana fitur baru dikembangkan dan toolkit-conversioncabang. Aturan yang paling penting adalah sederhana: lakukan hanya hal-hal di toolkit-conversioncabang yang relevan untuk konversi. Setiap kali ada sesuatu yang dapat dilakukan di master(toolkit GUI lama), saya melakukannya di sana dan toolkit-conversionmengubah perubahan saya ke masterkepala baru . Aturan lainnya adalah menjaga agar toolkit-conversioncabang tetap pendek. Karenanya saya sering menggunakan reset, cherry-pick dan amend-commit dan rebase untuk merekatkan milik lebih kecil ke yang lebih besar (yang pada akhirnya memiliki tujuan yang sama). Ini juga berfungsi dengan baik ketika saya sudah mencoba sesuatu yang tidak berfungsi dengan baik untuk "membatalkan" perubahan atau setelah saya refactored beberapa kode dengan kode pembantu sementara.

Saya telah memutuskan untuk tidak menggabungkan perubahan dari mastermenjadi toolkit-conversioncabang, karena akan jauh lebih sulit untuk mengubah kembali komitmen sebelumnya untuk menjaga cabang tetap bersih dan mudah ditinjau. Juga, penggabungan mungkin menimbulkan konflik yang resolusinya tidak sejelas ketika menjaga riwayat bersih.

Tentu saja, alur kerja ini juga memiliki kelemahan. Yang paling penting adalah, itu hanya bekerja dengan baik untuk satu orang. Ketika saya memaksa-mendorong toolkit-conversioncabang setelah rebased ke kepala master, menariknya pada repositori lain menjadi sulit (otomatis rebasing ke cabang pelacakan sering gagal dengan konflik).

Pada akhirnya, toolkit-conversioncabang saya tetap pendek, bersih dan mudah ditinjau. Saya tidak bisa membayangkan telah melakukan hal yang sama kuatnya dengan, misalnya, SVN.


2

Di perusahaan tempat saya bekerja saat ini, kami telah menerapkan variasi model percabangan yang sama untuk sementara waktu. Kami juga telah menggunakan scrum sehingga kami melakukan cabang per alur kerja cerita.

Satu-satunya masalah yang kami miliki sejauh ini adalah ketika tim cukup besar dan lebih dari satu cerita dapat dimulai dan cerita-cerita itu saling bergantung satu sama lain, itu menjadi semacam kekacauan untuk menggabungkan perubahan antara cabang dan kembali ke menguasai.

Selain itu, ini telah terbukti dapat dipercaya :).


1

Saat ini saya sibuk mengadaptasi alur kerja ini. Saya pikir ini alur kerja yang cukup baik, karena menggunakan model percabangan di mana git unggul.

Satu-satunya downside kecil adalah bahwa dibutuhkan disiplin dalam menahan alur kerja ini dan tidak mencoba untuk mengambil jalan pintas.

Pengembang kohana juga menggunakan alur kerja ini, dan mereka sepertinya sangat menyukainya.


1

Apakah Anda menggunakan ini atau alur kerja percabangan git yang serupa?

Kami menggunakan alur kerja serupa di tempat kerja, tetapi sedikit kurang rumit. Namun sangat terinspirasi oleh alur kerja ini, karena saya sudah membaca artikel ini berkali-kali. Saya bahkan memiliki pdf model percabangan dicetak dalam warna di samping meja saya :)

Apakah Anda menganggap ini pendekatan yang produktif?

Produktif. Bagaimana Anda mendefinisikan produktivitas? Ya, dalam pikiran saya yang paling penting adalah memiliki kualitas tinggi, setidaknya untuk mencoba dan mencapai kualitas yang lebih baik setiap saat. Terus meningkatkan proses dll. Jika Anda dapat menghasilkan kode kualitas, produktivitas akan mendapat manfaat darinya. Jadi pertanyaannya adalah: Apakah ini meningkatkan kualitas perangkat lunak? Dan jawaban saya untuk itu pasti ya.

Apa yang paling saya sukai dengan model percabangan jenis ini, adalah ia memperkenalkan cabang-cabang dalam berbagai lapisan kualitas. Semakin ke kanan dalam gambar, semakin tinggi stabilitas dan kualitas semakin tinggi. Cabang utama adalah suci dan semua komitmen di atasnya harus dianggap sebagai versi stabil dari perangkat lunak. Semakin ke kiri Anda pergi, semakin eksperimental dan semakin rendah stabilitas yang Anda dapatkan.

Segera setelah Anda menguji fitur-fitur baru dan perbaikan bug, Anda dapat secara bertahap mentransfernya dari kiri ke kanan dan dengan demikian memindahkan kode dengan kualitas tinggi tepat ketika Anda tahu bahwa kode memenuhi persyaratan kualitas yang Anda minta dari kode. Yah, setidaknya secara teori, karena Anda tidak dapat menguji semuanya hingga 100% dan tahu pasti bahwa kode tersebut tidak mengandung bug, karena selalu ada bug. Tapi itu memungkinkan Anda untuk menjaga kepercayaan diri yang tinggi.

Tidak ada yang menyebalkan sebagai programmer, selain bekerja dalam sistem di mana tidak ada yang percaya kode, karena mereka tahu itu hanya menyebalkan dan ada banyak bug di dalamnya.

Apakah Anda melihat ada kekurangan dengan pendekatan ini? Adakah potensi penurunan?

Sangat penting untuk memikirkan model percabangan Anda sehingga cocok dengan kebutuhan organisasi Anda. Hanya karena model ini berfungsi baik untuk sebagian orang, tidak berarti model ini optimal atau diinginkan untuk orang lain.

Selalu ada trade off dan bahkan dalam kasus ini. Satu trade off adalah jumlah cabang versus kompleksitas. Dengan memperkenalkan banyak jenis cabang yang berbeda, Anda meningkatkan kompleksitas alur kerja. Misalnya mungkin salah untuk selalu memaksa orang untuk membuat cabang fitur baru, ketika mereka mencoba untuk memperbaiki bug sederhana dengan mengubah beberapa baris kode.

Kita semua tahu bahwa bug lebih atau kurang rumit untuk dipecahkan. Jadi, ketika bug sepele ditemukan Anda mungkin ingin mengurangi kompleksitas dan administrasi untuk menyingkirkan overhead tambahan dan hanya membiarkan orang berkomitmen langsung ke mis master atau mengembangkan cabang. Tetapi karena sifat perbaikan Anda menjadi lebih rumit, ada baiknya biaya tambahan untuk membuat cabang baru bagi mereka. Terutama jika Anda tidak yakin dengan ukuran dan panjangnya atau jika Anda ingin meningkatkan kolaborasi antara Anda dan pengembang lainnya.

Jika Anda memiliki pendekatan yang lebih baik, maukah Anda berbagi, atau memberikan tautan ke artikel atau diskusi tentangnya?

Ini tidak diragukan lagi pendekatan yang baik dan mungkin cocok untuk sebagian besar kasus karena kebanyakan dari kita memiliki proses pengembangan yang sama, tetapi mungkin tidak cocok untuk semua orang. Saya sangat mendorong Anda untuk memikirkan bagaimana Anda menangani kode Anda sekarang, dan mencoba membuat model percabangan yang sesuai dengan yang sudah Anda miliki.

Poin terpenting adalah memulai dengan git dan sisanya akan mengikuti secara alami. Mulai yang sederhana dan secara bertahap tingkatkan! Jadilah kreatif!

Bersulang

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.