Saya baru-baru ini menemukan sebuah artikel MSDN tentang percabangan dan penggabungan dan SCM: Branching and Merging Primer - Chris Birmele .
Dalam artikel tersebut mereka mengatakan 'big bang merge' adalah antipattern yang menggabungkan:
Big Bang Merge - menunda cabang yang bergabung ke akhir upaya pengembangan dan berusaha menggabungkan semua cabang secara bersamaan.
Saya menyadari bahwa ini sangat mirip dengan apa yang dilakukan perusahaan saya dengan semua cabang pengembangan yang diproduksi.
Saya bekerja di perusahaan yang sangat kecil dengan satu orang yang bertindak sebagai peninjau akhir + otoritas gabungan trunk. Kami memiliki 5 pengembang (termasuk saya), masing-masing dari kami akan diberi tugas / bug / proyek terpisah dan kami masing-masing akan bercabang dari trunk saat ini (subversi) dan kemudian melakukan pekerjaan pengembangan di cabang kami, menguji hasilnya, menulis dokumentasi jika perlu, lakukan peer review dan loop umpan balik dengan pengembang lain, dan kemudian kirim cabang untuk ditinjau + bergabung pada perangkat lunak manajemen proyek kami.
Bos saya, satu-satunya otoritas di repositori trunk, sebenarnya akan menunda semua ulasan cabang sampai satu titik waktu di mana ia akan melakukan review sebanyak yang dia bisa, beberapa cabang akan dilempar kembali untuk peningkatan / perbaikan, beberapa cabang akan bergabung ke dalam bagasi, beberapa cabang akan terlempar ke belakang karena konflik, dll.
Ini tidak biasa bagi kita untuk memiliki 10-20 cabang aktif yang duduk dalam antrian tinjauan akhir untuk digabung menjadi bagasi.
Kami juga sering harus menyelesaikan konflik dalam tahap peninjauan akhir dan penggabungan karena dua cabang dibuat dari trunk yang sama tetapi memodifikasi bagian kode yang sama. Biasanya kita menghindari ini dengan hanya menata kembali batang pohon dan menerapkan kembali perubahan kita dan menyelesaikan konflik kemudian mengirimkan cabang baru untuk ditinjau (orang miskin rebase).
Beberapa pertanyaan langsung yang saya miliki adalah:
- Apakah kita menunjukkan pola yang sangat anti yang digambarkan sebagai 'big bang merge'?
- Apakah beberapa masalah yang kita lihat adalah hasil dari proses penggabungan ini?
- Bagaimana kita bisa meningkatkan proses penggabungan ini tanpa meningkatkan hambatan pada bos saya?
Sunting: Saya ragu bos saya akan melonggarkan cengkeramannya di repositori trunk, atau membiarkan pengembang lain bergabung ke trunk. Tidak yakin apa alasannya tetapi saya tidak benar-benar berencana untuk mengangkat topik karena sudah diangkat sebelumnya dan ditembak jatuh lebih cepat. Saya pikir mereka hanya tidak mempercayai kami, yang tidak masuk akal karena semuanya dilacak pula.
Wawasan lain apa pun tentang situasi ini akan dihargai.
sumber
Jawaban:
Beberapa saran:
Tidak ada yang salah dalam memiliki banyak cabang fitur atau perbaikan bug selama perubahan yang dilakukan di masing-masing cabang cukup kecil, Anda masih dapat menangani konflik gabungan yang dihasilkan secara efektif. Itu harus menjadi kriteria Anda jika cara kerja Anda ok, bukan beberapa artikel MSDN.
Setiap kali cabang digabungkan ke dalam trunk, trunk harus digabung ke semua cabang pengembangan terbuka secepatnya. Ini akan memungkinkan semua orang dalam tim untuk menyelesaikan konflik gabungan secara paralel di cabang mereka sendiri dan karenanya mengambil beberapa beban dari penjaga gerbang bagasi.
Ini akan bekerja lebih baik jika gatekeeper tidak akan menunggu sampai 10 cabang "siap untuk bergabung ke dalam trunk" - menyelesaikan konflik penggabungan dari integrasi trunk terakhir selalu memerlukan waktu untuk tim, jadi mungkin lebih baik untuk bekerja dalam interval waktu yang terjalin. - satu integrasi oleh gatekeeper, satu re-gabung oleh tim, integrasi berikutnya oleh gatekeeper, selanjutnya re-gabung oleh tim, dan sebagainya.
Untuk menjaga agar cabang tetap kecil, mungkin membantu untuk membagi fitur yang lebih besar menjadi beberapa tugas yang lebih kecil dan mengembangkan masing-masing tugas tersebut di cabang sendiri. Jika fitur ini belum siap produksi hingga semua subtugas diimplementasikan, sembunyikan dari produksi di belakang fitur toggle hingga semua subtugas selesai.
Cepat atau lambat Anda akan menjumpai tugas-tugas refactoring yang memengaruhi banyak file dalam basis kode - ini memiliki risiko tinggi menyebabkan banyak menggabungkan konflik dengan banyak cabang. Itu dapat ditangani dengan paling baik dengan mengkomunikasikannya dengan jelas dalam tim, dan pastikan untuk menanganinya persis seperti yang saya tulis di atas: dengan mengintegrasikannya terlebih dahulu ke semua cabang dev sebelum reintegrasi, dan dengan memecahnya menjadi sub-refactor yang lebih kecil.
Untuk ukuran tim Anda saat ini, memiliki penjaga gerbang tunggal mungkin masih berfungsi. Tetapi jika tim Anda akan bertambah besar, tidak ada jalan lain untuk memiliki penjaga gerbang kedua (atau lebih). Catatan saya tidak menyarankan untuk memungkinkan semua orang bergabung ke dalam bagasi, tetapi itu tidak berarti hanya bos Anda yang mampu melakukan ini. Mungkin ada satu atau dua pengembang senior yang bisa menjadi kandidat untuk melakukan pekerjaan penjaga gerbang juga. Dan bahkan untuk ukuran tim Anda saat ini, gatekeeper kedua dapat membuat tim Anda lebih mudah untuk berintegrasi ke bagasi lebih sering dan lebih awal, atau ketika bos Anda tidak tersedia.
sumber
Kedengarannya seperti itu.
Pastinya
Di perusahaan saya, setiap pengembang memiliki kemampuan untuk bergabung. Kami memberikan Permintaan Gabung ke pengembang lain, menjalani siklus peninjauan / umpan balik / pembaruan hingga kedua pihak puas. Kemudian pengulas menggabungkan kode.
10-20 cabang menunggu untuk digabung adalah tanda bahwa proses Anda cacat. Jika kita memiliki sebanyak itu, semua pekerjaan dev akan berhenti sampai selesai.
sumber
Ini pada dasarnya adalah bagaimana banyak proyek open source bekerja, termasuk yang paling terkenal adalah kernel Linux, yang memiliki banyak cabang dalam penerbangan daripada yang Anda lakukan pada waktu tertentu. Cara khas untuk menghindari penggabungan big bang dalam proyek ini adalah membuat cabang lain (atau banyak cabang) untuk integrasi berkelanjutan. Ini adalah cabang yang Anda gunakan untuk memastikan perubahan Anda bekerja sama dengan kolega Anda, dan itu diubah secara berkala ke bagasi ketika gatekeeper sempat melakukan review.
Secara opsional, Anda dapat menggunakan cabang ini untuk menggabungkan beberapa permintaan tarik Anda sendiri menjadi satu permintaan kohesif besar bagi bos Anda untuk ditinjau. Linus Torvalds biasanya mendapat permintaan tarikan yang telah terintegrasi dalam dua atau lebih level, dan dapat memiliki ukuran pada urutan, misalnya, driver sistem file baru yang lengkap.
sumber
Saya setuju dengan kedua Doc Brown tetapi saya juga melihat antipattern lain:
Dalam kerendahan hati saya, ada beberapa antipattern manajemen:
Rekomendasi:
sumber
Saat Anda melakukan pekerjaan fitur di cabang-cabang terpisah, Anda tidak dapat dengan mudah melakukan pengujian integrasi sampai salah satu cabang digabungkan ke bagasi dan ditarik ke cabang fitur lainnya. Dalam pengalaman saya, ini adalah masalah utama dengan anti-pola Big Bang Merge. Idealnya, Anda akan melakukan kerja fitur, mengujinya di cabang fitur, menggabungkannya ke dalam trunk, dan pada saat itu Anda selesai dengan fitur tersebut. Jika belum digabung, Anda harus mengunjungi kembali setiap kali ada yang lain digabungkan ke dalam trunk sebelumnya. Kelemahan dari pola-anti ini adalah Anda memiliki banyak bug tipe integrasi yang muncul di akhir siklus pengembangan.
sumber
Jadi, Anda memiliki 20 cabang. Cabang 1 baru saja digabung. Kemudian pengembang cabang 2 harus menggabungkan cabang 1 ke cabang mereka untuk dapat bergabung menjadi utama tanpa konflik, kemudian bergabung. Kemudian pengembang cabang 3 harus menggabungkan cabang 1 dan cabang 2 ke cabang mereka untuk dapat bergabung menjadi utama tanpa konflik, kemudian bergabung.
Latihan untuk pembaca: Menulis program yang mencetak posting lengkap saya :-)
Ini adalah kegilaan. Anda akan menghabiskan banyak waktu untuk menggabungkan.
sumber
Mengingat cara Anda bekerja dan bahwa bos Anda adalah orang yang memegang kendali yang bertanggung jawab, percabangan itu sendiri tampaknya menjadi masalah. Alih-alih membuat cabang untuk setiap fitur, mintalah setiap pengembang mengkomit fitur-fiturnya di bagian, langsung ke bagasi. Ini menempatkan beban integrasi pada pengembang dalam beberapa langkah kecil (win-win). Penjaga gerbang dapat mengikuti pelacakan perubahan yang lebih kecil dalam periode yang lebih lama di awal siklus pengembangan dan masih menjadi master reviewer.
Bercabang sendiri adalah sesuatu yang tidak ingin Anda lakukan kecuali Anda memiliki alasan yang sangat baik untuk melakukannya atau Anda tidak memiliki pilihan lain. Anda cukup kecil untuk menyelaraskan berbagai hal, yang akan lebih mudah dan aman.
sumber