Kapan Anda harus bercabang?

107

Saat bekerja dengan sistem SCM, kapan Anda harus bercabang?

Ben Aston
sumber

Jawaban:

59

Ada beberapa kegunaan percabangan. Salah satu kegunaan paling umum adalah untuk memisahkan proyek yang pernah memiliki basis kode yang sama. Ini sangat berguna untuk bereksperimen dengan kode Anda, tanpa mempengaruhi trunk utama.

Secara umum, Anda akan melihat dua jenis cabang:

  • Cabang Fitur: Jika fitur tertentu cukup mengganggu sehingga Anda tidak ingin seluruh tim pengembangan terpengaruh pada tahap awalnya, Anda dapat membuat cabang untuk melakukan pekerjaan ini.

  • Fixes Branch: Sementara pengembangan berlanjut di trunk utama, cabang perbaikan dapat dibuat untuk menyimpan perbaikan ke versi software terbaru yang dirilis.

Anda mungkin tertarik untuk membaca artikel berikut, yang menjelaskan prinsip-prinsip percabangan, dan kapan menggunakannya:

Daniel Vassallo
sumber
Saya tidak pernah mendengar atau memikirkan penggunaan umum yang Anda sebutkan tetapi itu adalah ide yang sangat keren. Saya benar-benar mungkin menggunakan ini dalam proyek yang akan datang. Terima kasih telah menunjukkannya.
Nils Riedemann
82

Secara umum, tujuan utama percabangan (VCS - Fitur Sistem Kontrol Versi) adalah untuk mencapai isolasi kode .

Anda memiliki setidaknya satu cabang, yang cukup untuk pengembangan sekuensial, dan digunakan untuk banyak tugas yang sedang direkam (dilakukan) pada cabang unik yang sama.

Tetapi model itu dengan cepat menunjukkan batasnya:

Ketika Anda memiliki upaya pengembangan (pemfaktoran ulang, evolusi, perbaikan bug, ...) dan Anda menyadari bahwa Anda tidak dapat dengan aman membuat perubahan tersebut di cabang yang sama dengan cabang pengembangan Anda saat ini (karena Anda akan merusak API, atau memperkenalkan kode yang akan merusak semuanya), maka Anda membutuhkan cabang lain .
(Untuk mengisolasi kode baru itu untuk yang lama, meskipun dua set kode akan digabungkan nanti)

Jadi itulah jawaban Anda saat ini:
Anda harus bercabang setiap kali Anda tidak dapat mengejar dan mencatat dua upaya pengembangan dalam satu cabang.
(tanpa memiliki sejarah yang sangat rumit untuk dipertahankan).


Sebuah cabang dapat berguna bahkan jika Anda adalah satu-satunya yang mengerjakan kode sumber, atau jika Anda banyak.
Namun Anda tidak boleh membuat "satu cabang per pengembang":
tujuan "isolasi" dibuat untuk mengisolasi upaya pengembangan (tugas yang dapat bersifat umum seperti "mari kembangkan versi berikutnya dari perangkat lunak kita" atau sespesifik seperti "mari perbaiki bug 23 "),
bukan untuk mengisolasi" resource " .

(cabang bernama "VonC" tidak berarti apa-apa bagi pengembang lain: Bagaimana jika "VonC" keluar dari proyek? Apa yang harus Anda lakukan dengannya?
cabang bernama "perbaikan bug_212" dapat diinterpretasikan dalam konteks sistem pelacakan bug misalnya , dan pengembang mana pun dapat menggunakannya dengan setidaknya beberapa gagasan tentang apa yang seharusnya dia lakukan dengannya)

Sebuah cabang bukanlah sebuah tag (SVN adalah Sistem Revisi yang mencoba untuk mengusulkan fitur versi seperti percabangan dan penandaan melalui direktori dengan salinan file yang murah: itu tidak berarti sebuah tag adalah sebuah cabang)

Untuk menentukan cabang berarti juga mendefinisikan alur kerja gabungan : Anda perlu tahu di mana untuk menggabungkan cabang Anda saat Anda selesai dengannya.
Untuk itu, Bab 7 dari Praktis Perforce (Laura WINGERD - O'Reilly) adalah pengantar yang baik (VCS agnostik) untuk menggabungkan alur kerja antara berbagai jenis cabang: "" Bagaimana Evolusi Perangkat Lunak "(pdf)

Ini mendefinisikan istilah codeline (cabang yang merekam langkah evolusi kode yang signifikan, baik melalui tag pada titik tertentu, atau melalui penggabungan penting kembali ke cabang)

Ini memperkenalkan model jalur utama (garis kode pusat untuk merekam rilis), dan menjelaskan berbagai tujuan untuk percabangan:

  • Aliran pengembangan aktif : garis kode tetap ketika berbagai perkembangan berurutan terjadi
  • cabang tugas : cabang berumur pendek untuk tugas yang lebih spesifik (perbaikan bug adalah yang klasik, tetapi Anda juga dapat menentukan cabang untuk upaya penggabungan yang Anda tahu rumit untuk diselesaikan: Anda dapat menggabungkan, berkomitmen, dan menguji di cabang tugas itu tanpa menimbulkan masalah untuk cabang pengembangan utama saat ini)
  • staging branch : untuk menyiapkan rilis, dengan beberapa data khusus praproduksi atau file konfigurasi.
  • Cabang privat, cabang ad hoc, dan cabang jarang : untuk tugas yang sangat kecil, hanya untuk dapat melakukan beberapa pekerjaan yang sedang berlangsung tanpa menunggu penyelesaian formal atau tinjauan pengujian.
    Itu memungkinkan untuk "berkomitmen lebih awal, sering berkomitmen".

Konsep menarik lainnya seputar VCS: Konsep dasar
(tentang ClearCase aslinya, tetapi juga berlaku untuk VCS apa pun)

VonC
sumber
19

Semua SCM abad ke-21 memberi tahu Anda:

Cabang untuk setiap tugas yang harus Anda kerjakan , tidak peduli apakah ini fitur baru, perbaikan bug, tes, apa pun. Ini disebut cabang topik, dan ini mengubah cara Anda bekerja dengan SCM Anda.

Anda mendapatkan:

  • Isolasi yang lebih baik
  • Keterlacakan yang lebih baik -> Anda mengaitkan tugas dengan cabang, bukan set perubahan individu, yang membuat Anda bebas untuk berkomitmen sebanyak yang Anda inginkan dan tidak memaksakan batasan seperti "satu check in per tugas".
  • Tugas bersifat independen (biasanya dimulai dari baseline yang stabil, jadi Anda hanya fokus pada kode Anda, bukan pada memperbaiki bug dari orang tua Anda), dan Anda dapat memilih apakah Anda ingin mengintegrasikannya pada suatu saat atau nanti, tetapi selalu di bawah kontrol versi
  • Anda dapat meninjau kode dengan mudah (dari kontrol versi, bukan omong kosong pra-komit) sebelum mencapai baris utama

Alat yang dapat melakukannya:

Alat yang TIDAK BISA melakukannya:

  • SVN
  • CVS
  • VSS
  • TFS
  • Terpaksa
pablo
sumber
1
Mengapa Anda tidak dapat melakukannya dengan SVN ??
yegor256
4
SVN bukanlah penggabungan yang baik. Karena kurangnya pelacakan penggabungan yang tepat. Juga karena membuat cabang tidak semurah yang saya tunjuk, itu akhirnya menjadi mimpi buruk dalam kondisi nyata.
pablo
Keterlacakan yang lebih baik: Mengapa Anda ingin berkomitmen sebanyak yang Anda inginkan? Bukankah cukup sekali per tugas jika tugas tersebut bukan fitur yang rumit? Juga bug dari orang-orang dapat dengan mudah menuju ke cabang utama dan membuatnya tidak "stabil" dan tidak "aman", tepat pada saat mereka bergabung.
Paiman Samadian
@PaimanSamadian: "Bukankah sekali per tugas cukup ketika tugas bukanlah fitur yang rumit?" Tentu. Dengan cara yang sama, ketika tugas yang rumit, salah satu komit tidak cukup (saya melakukan setiap beberapa menit jika semuanya berjalan lancar). Mengapa memaksa satu komit per tugas? • "Juga bug dari orang-orang dapat dengan mudah menuju ke cabang utama" Sebenarnya tidak. Bagian dari inti alur kerja cabang fitur adalah memungkinkan peninjauan dan pengujian kode sebelum kode digabungkan ke dalam cabang utama.
Marnen Laibow-Koser
1
@PaimanSamadian beberapa check-in sangat bagus untuk menjelaskan perubahan menengah dan memudahkan tinjauan. Selain itu, jika Anda mengerjakan sesuatu selama beberapa jam, banyak check-in bagus.
pablo
8

Itu juga tergantung pada alat SCM yang Anda gunakan. SCM modern (git, mercurial, dll.) Membuatnya semakin mudah untuk membuat dan menghancurkan cabang kapan pun diperlukan. Ini memungkinkan Anda, misalnya, membuat satu cabang per bug yang sedang Anda tangani. Setelah Anda menggabungkan hasil Anda ke dalam bagasi, Anda membuang cabangnya.

SCM lain, misalnya subversi dan CVS, memiliki paradigma percabangan yang jauh "lebih berat". Itu berarti, sebuah cabang dianggap tepat hanya untuk sesuatu yang lebih besar dari tambalan garis dua puluh sesuatu. Di sana, cabang secara klasik digunakan untuk melacak seluruh jalur pengembangan, seperti versi produk sebelumnya atau yang akan datang.

Fred
sumber
5

Saat Anda perlu membuat perubahan yang signifikan dan / atau eksperimental pada basis kode Anda, terutama jika Anda ingin melakukan perubahan perantara, tanpa memengaruhi trunk.

Dominic Rodger
sumber
5

Itu tergantung pada jenis SCM yang Anda gunakan.

Dalam versi terdistribusi yang lebih baru (seperti git dan mercurial), Anda membuat cabang setiap saat dan tetap muncul kembali. Saya akan sering mengerjakan cabang terpisah untuk sementara waktu hanya karena seseorang merusak build di jalur utama, atau karena jaringan tidak aktif, dan kemudian menggabungkan perubahan kembali nanti ketika sudah diperbaiki, dan sangat mudah untuk melakukannya bahkan tidak mengganggu .

Dokumen (singkat dan dapat dibaca) yang paling membantu saya memahami apa yang terjadi dalam sistem terdistribusi adalah: UnderstandingMercurial .

Dalam sistem lama dengan repositori pusat, (seperti CVS, SVN, dan ClearCase), ini adalah masalah yang jauh lebih serius yang perlu diputuskan di tingkat tim, dan jawabannya harus lebih seperti 'mempertahankan rilis lama sambil mengizinkan pengembangan untuk melanjutkan di jalur utama ', atau' sebagai bagian dari eksperimen besar '.

Model terdistribusi jauh lebih baik, menurut saya, dan kekurangan alat grafis yang bagus untuk menjadi paradigma yang dominan. Namun ini tidak dipahami secara luas, dan konsepnya berbeda, sehingga dapat membingungkan pengguna baru.

John Lawrence Aspden
sumber
3

Menurut saya, saran dari Laura Wingerd & Christopher Seiwald di Perforce sangat ringkas dan berguna:

* Branch only when necessary.
* Don't copy when you mean to branch.
* Branch on incompatible policy.
* Branch late.
* Branch, instead of freeze.

Lihat http://www.perforce.com/sites/default/files/pdf/perforce-best-practices.pdf untuk penjelasan rinci tentang masing-masing dan praktik terbaik lainnya.

Lester Cheung
sumber
3
Dulu orang P4 mengatakan ini, tetapi sekarang pemasaran mereka mengatakan sesuatu yang berbeda. Mereka mencoba menghindari percabangan selama bertahun-tahun, hanya karena mereka tidak dapat melakukan tugas atau topik cabang sebaik sistem lain di luar sana seperti Git
pablo
Tanggapan di 2015! Alasan untuk menghindari cabang adalah untuk menghindari kebutuhan untuk menggabungkan - bukan karena Perforce tidak memiliki cabang tugas / topik (Anda dapat melakukan "cabang tugas" di aliran - di Perforce kami menyebutnya "aliran tugas". Seperti yang telah disebutkan orang lain - percabangan tersirat dalam DVCS dan pertanyaannya menjadi tidak sopan. Saya rasa diskusi harus dibatasi hanya pada alat yang bekerja dengan cara klien-server. Atau DVCS digunakan secara terpusat (sejak rilis 2015.1 Anda dapat menggunakan Perforce dalam mode DVCS - terbaik dari kedua dunia).
Lester Cheung
2

Ada berbagai tujuan percabangan:

  1. Cabang fitur / bug. Cabang dinamis dan aktif yang dipindahkan kembali ke bagasi saat perbaikan fitur / bug selesai.
  2. Cabang statis (tag di Subversion, meskipun pada dasarnya hanya 'cabang normal'). Mereka menyediakan snapshot statis katakanlah, sebuah rilis. Meskipun bisa dikerjakan, mereka tetap tidak tersentuh.
Wim Hollebrandse
sumber
1

Kebutuhan percabangan juga mungkin muncul:

  • saat Anda ingin memberikan perbaikan terbaru kepada pelanggan tertentu (katakanlah penting) dan Anda tidak yakin apakah perbaikan akan menjadi bagian dari rilis mendatang

  • sateesh
    sumber
    1

    Kapanpun Anda merasa seperti itu.

    Anda mungkin tidak akan terlalu sering jika Anda bekerja dengan SCM terpusat karena cabang adalah bagian dari repositori resmi, dan itu tidak terlalu mengundang banyak eksperimen, belum lagi penggabungan sangat merugikan.

    OTOH, tidak ada perbedaan teknis antara cabang dan checkout di SCM terdistribusi, dan penggabungan jauh lebih mudah. Anda akan merasa ingin bercabang lebih sering.

    hanya seseorang
    sumber
    0

    Saat Anda perlu membuat perubahan, berdasarkan cabang Anda saat ini, tidak ditakdirkan untuk rilis berikutnya dari cabang itu (dan bukan sebelumnya).

    Misalnya, kami biasanya mengerjakan bagasi. Sekitar waktu rilis, seseorang akan perlu melakukan perubahan yang tidak kita inginkan dalam rilis saat ini (mungkin sebelum rilis, saat ini biasanya setelah rilis). Ini adalah saat kita bercabang, untuk meletakkan rilis di cabangnya sendiri dan melanjutkan pengembangan untuk rilis berikutnya di bagasi.

    Andrew Aylett
    sumber
    0

    Mengesampingkan semua hal teknis .....

    Cabang saat Anda tahu lebih mudah untuk bergabung kembali!

    Perlu diingat bahwa penggabungan akan selalu dipengaruhi oleh bagaimana pekerjaan tersebut dilakukan dalam sebuah proyek.

    Setelah ini tercapai, semua masalah tersier lainnya akan ikut bermain.

    Syed M Shaaf
    sumber