Apakah lebih baik untuk menggabungkan "sering" atau hanya setelah selesai melakukan penggabungan besar cabang fitur?

40

Katakanlah beberapa cabang sedang dikembangkan, Adan B, juga cabang "perbaikan bug" tambahan C.

Sekarang Csudah "selesai" dan digabung menjadi master. Adan Bmasih dalam pengembangan dan tidak akan diperbaiki sebelum (mungkin) cabang perbaikan bug lainnya digabung menjadi master.

Apakah ide yang baik untuk bergabung Csesegera mungkin di cabang fitur baru? Sehingga fitur-fitur baru tetap sedekat mastermungkin? Atau lebih baik membiarkan fitur baru dikembangkan di "dunia" mereka sendiri hanya bergabung menjadi master setelah selesai?

Bagaimanapun, akan ada konflik, jadi waktu perlu dihabiskan untuk memperbaikinya.

paul23
sumber
5
@gnat yaitu tentang menggabungkan fitur cabang menjadi jalur utama, saya bertanya-tanya apakah menggabungkan kembali fitur utama saat fitur sedang dikembangkan adalah baik, untuk "menyelesaikan konflik lebih awal".
paul23
1
@ paul23, saya akan mengatakan itu adalah kebutuhan praktis.
Berin Loritsch
3
Sejujurnya, banyak masalah versi saya hilang ketika saya mulai menggunakan desain yang tepat pada kode saya, seperti mengisolasi modul dan membuat model pekerjaan yang didefinisikan dengan baik. Jika Anda terlalu banyak tersandung pada masalah selama penggabungan, Anda mungkin memiliki masalah lain yang lebih serius yang bersembunyi di suatu tempat. Desain yang baik sangat membantu dalam menghindari konflik yang tidak perlu.
T. Sar - Pasang kembali Monica
2
Anda mungkin ingin bergabung dari master secara teratur untuk tetap dekat "cukup" untuk tidak membuat penggabungan nanti terlalu menyakitkan.
Thorbjørn Ravn Andersen

Jawaban:

71

Semakin lama sebuah cabang hidup, semakin ia dapat menyimpang dari cabang utama dan semakin berantakan dan semakin rumit hasil gabungannya ketika akhirnya selesai. Sepuluh konflik kecil lebih mudah diselesaikan daripada 1 konflik besar, dan sebenarnya dapat mencegah pengembang menggandakan atau membuang-buang upaya. Mengingat bahwa, Anda harus menggabungkan masterke dalam Adan Bteratur; sekali sehari adalah rekomendasi yang cukup umum, meskipun jika Anda memiliki banyak aktivitas di cabang Anda, Anda mungkin ingin bergabung beberapa kali sehari.

Selain membuat resolusi konflik lebih mudah, Anda secara spesifik menyebutkan Ccabang bugfix. Sebagai pengembang, saya ingin cabang saya memiliki semua perbaikan bug terbaru, untuk memastikan saya tidak mengulangi perilaku yang mengarah ke bug, atau menulis tes berdasarkan data yang salah.

Bagaimanapun, akan ada konflik, jadi waktu perlu dihabiskan untuk memperbaikinya.

Jika Anda tahu akan ada konflik, Anda mungkin ingin mengadopsi strategi percabangan yang berbeda. Simpan beberapa perubahan pada file yang sama di cabang yang sama bila memungkinkan, dan Anda mengurangi atau menghilangkan jumlah konflik. Refactor cerita sehingga mereka sepenuhnya independen sebanyak mungkin, dan pengerjaan ulang cabang untuk mungkin mencakup beberapa cerita (cabang, fitur, dan cerita tidak selalu dapat dipertukarkan).

mmathis
sumber
33
Gabungkan atau rebase , karena rebasing sering menghasilkan riwayat komit yang lebih bersih.
chrylis -pada mogok-
11
@chrylis: Rebasing mungkin berbahaya jika "cabang meliput kisah mutliple" dianggap berarti bahwa dua pengembang bekerja di cabang yang sama.
meriton - saat mogok
9
@meriton dari dokumen resmi: Jangan rebase komit yang ada di luar repositori Anda dan orang-orang mungkin telah mengerjakannya berdasarkan itu. Jika Anda mengikuti pedoman itu, Anda akan baik-baik saja. Jika tidak, orang akan membenci Anda, dan Anda akan dihina oleh teman dan keluarga. LOL
Xtreme Biker mengembalikan Monica
6
@XtremeBiker: Rebase di Git mengubah riwayat. Git bekerja seperti kehidupan nyata dalam hal ini: untuk mengubah sejarah, Anda memerlukan konspirasi. Ada cabang di repositori untuk Git itu sendiri yang secara teratur diubah, dan itu adalah yang sangat umum. Alasannya adalah karena ada konspirasi: setiap orang yang menggunakan cabang ini setuju untuk menulis ulang sejarah pada waktu-waktu tertentu, sehingga mereka akan memastikan bahwa mereka berada dalam posisi untuk memiliki segalanya untuk digabungkan pada saat itu.
Jörg W Mittag
1
@ paul23 Dengan serius mempertimbangkan pengiriman A dan B ke cabang bersama yang baru sebelum mengirimnya untuk dikuasai. Jika keduanya merupakan perombakan radikal, Anda ingin mereka bersama-sama untuk serangkaian pengujian sebelum melakukan kombinasi pada master. Jika Anda yakin dapat mengirim satu langsung ke master dan kemudian mengirimkan yang lain ke cabang yang baru diperbarui. Anda mungkin ingin dapat melihat kode asli dari fitur kedua jika penggabungannya buruk atau Anda perlu mendesain ulang sesuatu.
Hormat
11

Dengan asumsi niat Anda adalah untuk akhirnya menggabungkan A, B kembali menjadi master dan mempertahankan basis kode tunggal, tidak pernah merupakan ide yang baik untuk menyimpang dari master terlalu jauh. Menyimpang dari master terlalu lama, terutama ketika perbaikan bug dan pengembangan lainnya bergabung untuk menguasai sebagai A, B sedang dikembangkan, tentu akan menyebabkan konflik.

Saya akan mempertimbangkan strategi yang mirip dengan mengikuti

  1. Siapa pun yang bertanggung jawab untuk A, B harus memperhatikan master dengan cermat dan menggabungkan setiap perubahan.
  2. Lebih baik lagi, jika Anda telah membangun dan menguji otomatisasi, pastikan A, B bergabung dalam master, dan lulus tes setiap malam.
  3. Berdasarkan komentar Anda untuk jawaban lain, tampaknya A, B dapat membutuhkan waktu untuk berkembang. Dalam hal ini, Anda bahkan dapat mempertimbangkan untuk memiliki A, B untuk saling menggabungkan satu sama lain sehingga pada akhirnya Anda tidak memiliki masalah besar untuk menggabungkan keduanya kembali menjadi master.
  4. Pada level yang lebih tinggi, pikirkan mengapa Anda membutuhkan 2 jalur pengembangan panjang yang terpisah. Bisakah Anda memecah menjadi gabungan yang lebih kecil? Bisakah Anda masuk ke layanan mikro yang terpisah?
kenchew
sumber
5

Biasanya seringkali lebih baik daripada yang besar.

Permintaan tarik yang lebih kecil, lebih sering, hampir selalu lebih baik.

Saya sudah mulai menggunakan flag konfigurasi terutama sehingga saya bisa melakukan permintaan tarikan yang lebih kecil lebih awal sehingga saya bisa, pada gilirannya, menggabungkan kode lebih mudah, tetapi membiarkan fitur dinonaktifkan. Semakin kecil permintaan tarik, semakin mudah untuk meninjau kode, bahkan jika ada lebih banyak permintaan tarik total. Kebanyakan manusia dalam bentuk apa pun tidak akan dapat melakukan tinjauan yang berarti atas permintaan tarik besar-besaran. Ini terlalu sulit pada RAM mental seseorang untuk memahami semua implikasi yang mungkin dari perubahan kode besar-besaran.

Ada overhead tambahan dalam membuat flag konfigurasi, jadi tidak sepadan dengan fitur yang lebih kecil. Namun permintaan tarik Anda akan kecil.

Namun, mungkin ada situasi di mana fitur tersebut harus dirilis sekaligus. Bahkan mungkin lebih baik melakukan permintaan tarik yang lebih kecil ke cabang lain yang dibuat untuk tujuan itu.

Sebagian besar kolega saya mengerang ketika seseorang membuat permintaan penarikan besar-besaran, dan sebagian besar, memang demikian.

Juga perhatikan bahwa kadang-kadang saya perlu memilih cherry memilih cabang yang terpisah. Jika apa yang perlu dipetik cherry dapat dimasukkan ke dalam satu komit itu membuatnya lebih mudah untuk memindahkannya ke cabang lain. Ini adalah kasus di mana sebenarnya memiliki sedikit melakukan lebih baik, tetapi itu bukan proses standar jika ceri Anda memilih-milih.

Mark Rogers
sumber
1
Bendera fitur bisa mahal (USD 450 juta dalam 45 menit). Contoh ini juga disebutkan oleh Paman Bob (tetapi tanpa teknis apa pun (seperti yang diharapkan)).
Peter Mortensen
1
Ya, ada biaya tambahan untuk menghapusnya, meskipun biasanya tidak terlalu sulit. Orang mungkin mempertahankannya lebih lama, tetapi kemudian bendera tersebut memberikan penggunaan yang lebih besar. Saya setuju jika dilakukan dengan sembarangan atau tanpa tindak lanjut, maka semuanya bisa menjadi buruk. Meskipun hal-hal bisa menjadi buruk ketika permintaan tarik besar menjadi sulit untuk ditinjau. Di sisi lain, beberapa orang mungkin tidak dalam posisi untuk menambahkan sesuatu seperti flag konfigurasi ke aplikasi yang sedang mereka kerjakan. Secara umum ini membantu dengan UAT dan peluncuran fitur.
Mark Rogers
3

Dalam Refactoring oleh Martin Fowler, saran yang dia berikan adalah jangan pernah membiarkan dahan bercabang dari master lebih dari sehari. IIRC, Anda harus melakukan perubahan kecil, uji untuk memastikan bahwa Anda tidak merusak apa pun, dan kemudian menggabungkannya kembali.

JohnnyApplesauce
sumber
2
Nah Adan Btahan perombakan besar baru yang radikal terhadap cara kerja aplikasi, mereka tidak "selesai" dalam sebulan. Namun mereka juga tidak berguna sebelum mereka selesai ...
paul23
8
Mereka mungkin tidak berguna sebelum mereka selesai - mereka memberikan nilai dengan menjadi langkah menuju hasil penuh, dan mengurangi pekerjaan yang dibutuhkan di masa depan. Menggunakan teknik seperti fitur toggle, cabang dengan abstraksi, atau hanya melakukan bagian antarmuka pengguna terakhir itu mungkin untuk menggabungkan dengan aman itu pekerjaan yang tidak lengkap untuk dikuasai.
bdsl
1
itu sebabnya rebasing lokal Anda di atas segala perubahan di cabang master berguna untuk pengembangan jangka panjang. Menyimpan pekerjaan Anda seolah-olah baru saja bercabang terbaru
NKCampbell
2

Opsi lain untuk perubahan yang benar-benar berumur panjang yang mungkin selesai tetapi tidak siap untuk digunakan adalah menempatkan mereka di belakang flag fitur sehingga mereka dapat digabungkan untuk dikuasai tetapi tidak memiliki risiko merusak apa pun. Kemudian ketika mereka siap digunakan bendera fitur dapat dihapus.

Qwertie
sumber
1
Bendera fitur = kode zombie (hingga dibangkitkan)?
Peter Mortensen
@PeterMortensen Nah Anda harus bertujuan untuk menghapus bendera sesegera mungkin tetapi itu bisa bekerja untuk situasi tertentu
Qwertie
3
@PeterMortensen tidak jika bendera dihidupkan untuk setidaknya satu orang
Ian