Pertama-tama, seperti yang ditunjukkan oleh @AndrewFinnell dan @KenLiu, dalam SVN nama direktori itu sendiri tidak ada artinya - "trunk, branch and tag" hanyalah sebuah konvensi umum yang digunakan oleh kebanyakan repositori. Tidak semua proyek menggunakan semua direktori (itu cukup umum untuk tidak menggunakan "tag" sama sekali), dan pada kenyataannya, tidak ada yang menghentikan Anda dari memanggil mereka apa pun yang Anda suka, meskipun melanggar konvensi sering membingungkan.
Saya akan menjelaskan kemungkinan skenario penggunaan cabang dan tag yang paling umum, dan memberikan contoh skenario bagaimana mereka digunakan.
Batang : Area pengembangan utama. Di sinilah rilis utama Anda berikutnya dari kode hidup, dan umumnya memiliki semua fitur terbaru.
Cabang : Setiap kali Anda merilis versi utama, itu membuat cabang dibuat. Ini memungkinkan Anda untuk melakukan perbaikan bug dan membuat rilis baru tanpa harus merilis fitur terbaru - mungkin belum selesai atau belum teruji.
Tag : Setiap kali Anda merilis versi (rilis final, rilis kandidat (RC), dan beta) Anda membuat tag untuk itu. Ini memberi Anda salinan kode waktu seperti saat berada pada keadaan itu, memungkinkan Anda untuk kembali dan mereproduksi bug apa pun jika perlu dalam versi masa lalu, atau merilis kembali versi masa lalu persis seperti sebelumnya. Cabang dan tag di SVN ringan - di server, itu tidak membuat salinan lengkap dari file, hanya penanda yang mengatakan "file-file ini disalin pada revisi ini" yang hanya memakan beberapa byte. Dengan mengingat hal ini, Anda tidak perlu khawatir tentang membuat tag untuk kode apa pun yang dirilis. Seperti yang saya katakan sebelumnya, tag sering dihilangkan dan sebagai gantinya, changelog atau dokumen lain mengklarifikasi nomor revisi ketika rilis dibuat.
Misalnya, katakanlah Anda memulai proyek baru. Anda mulai bekerja di "trunk", pada apa yang akhirnya akan dirilis sebagai versi 1.0.
- trunk / - versi pengembangan, segera menjadi 1,0
- cabang / - kosong
Setelah 1.0.0 selesai, Anda cabang trunk ke cabang "1.0" baru, dan membuat tag "1.0.0". Sekarang kerjakan apa yang nantinya akan menjadi 1,1 berlanjut di bagasi.
- trunk / - versi pengembangan, segera menjadi 1,1
- branch / 1.0 - 1.0.0 versi rilis
- tags / 1.0.0 - 1.0.0 versi rilis
Anda menemukan beberapa bug dalam kode, dan memperbaikinya di bagasi, dan kemudian menggabungkan perbaikan ke cabang 1.0. Anda juga dapat melakukan yang sebaliknya, dan memperbaiki bug di cabang 1.0 dan kemudian menggabungkannya kembali ke trunk, tetapi biasanya proyek tetap dengan penggabungan satu arah hanya untuk mengurangi kemungkinan kehilangan sesuatu. Terkadang bug hanya dapat diperbaiki di 1.0 karena usang di 1.1. Tidak masalah: Anda hanya ingin memastikan bahwa Anda tidak merilis 1.1 dengan bug yang sama yang telah diperbaiki di 1.0.
- trunk / - versi pengembangan, segera menjadi 1,1
- branch / 1.0 - rilis 1.0.1 mendatang
- tags / 1.0.0 - 1.0.0 versi rilis
Setelah Anda menemukan cukup banyak bug (atau mungkin satu bug kritis), Anda memutuskan untuk melakukan rilis 1.0.1. Jadi, Anda membuat tag "1.0.1" dari cabang 1.0, dan lepaskan kodenya. Pada titik ini, trunk akan berisi apa yang akan menjadi 1.1, dan cabang "1.0" berisi kode 1.0.1. Lain kali Anda merilis pembaruan ke 1.0, itu akan menjadi 1.0.2.
- trunk / - versi pengembangan, segera menjadi 1,1
- branch / 1.0 - rilis 1.0.2 mendatang
- tags / 1.0.0 - 1.0.0 versi rilis
- tags / 1.0.1 - 1.0.1 versi rilis
Akhirnya Anda hampir siap untuk merilis 1.1, tetapi Anda ingin melakukan beta terlebih dahulu. Dalam hal ini, Anda kemungkinan melakukan cabang "1.1", dan tag "1.1beta1". Sekarang, kerjakan apa yang akan menjadi 1.2 (atau 2.0 mungkin) berlanjut di trunk, tetapi bekerja di 1.1 berlanjut di cabang "1.1".
- trunk / - versi pengembangan, segera menjadi 1,2
- branch / 1.0 - rilis 1.0.2 mendatang
- branch / 1.1 - rilis 1.1.0 mendatang
- tags / 1.0.0 - 1.0.0 versi rilis
- tags / 1.0.1 - 1.0.1 versi rilis
- tags / 1.1beta1 - 1.1 versi rilis beta 1
Setelah Anda merilis 1.1 final, Anda melakukan tag "1.1" dari cabang "1.1".
Anda juga dapat terus mempertahankan 1.0 jika Anda mau, porting perbaikan bug di antara ketiga cabang (1.0, 1.1, dan trunk). Yang penting adalah untuk setiap versi utama dari perangkat lunak yang Anda pertahankan, Anda memiliki cabang yang berisi versi kode terbaru untuk versi itu.
Penggunaan cabang lainnya adalah untuk fitur. Di sinilah Anda bercabang batang (atau salah satu cabang rilis Anda) dan bekerja pada fitur baru secara terpisah. Setelah fitur selesai, Anda menggabungkannya kembali dan menghapus cabang.
- trunk / - versi pengembangan, segera menjadi 1,2
- branch / 1.1 - rilis 1.1.0 mendatang
- branch / ui-rewrite - cabang fitur eksperimental
Gagasannya adalah ketika Anda mengerjakan sesuatu yang mengganggu (yang akan menahan atau mengganggu orang lain untuk melakukan pekerjaan mereka), sesuatu yang eksperimental (yang mungkin bahkan tidak berhasil), atau mungkin hanya sesuatu yang membutuhkan waktu lama. (dan Anda takut jika menahan rilis 1.2 ketika Anda siap untuk mengambil 1.2 dari trunk), Anda dapat melakukannya secara terpisah di cabang. Secara umum, Anda selalu memperbaruinya dengan trunk dengan menggabungkan perubahan ke dalamnya setiap saat, yang membuatnya lebih mudah untuk diintegrasikan kembali (digabung kembali ke trunk) ketika Anda selesai.
Perhatikan juga, skema versi yang saya gunakan di sini hanyalah satu dari banyak. Beberapa tim akan melakukan rilis perbaikan / pemeliharaan bug sebagai 1.1, 1.2, dll., Dan perubahan besar sebagai 1.x, 2.x, dll. Penggunaan di sini adalah sama, tetapi Anda dapat menamai cabang "1" atau "1 .x "bukannya" 1.0 "atau" 1.0.x ". (Selain itu, versi semantik adalah panduan yang baik tentang cara melakukan nomor versi).