Saya mengerti sebagian besar konsep dasar Git / Github sekarang, namun saya masih kesulitan memahami gambaran yang lebih besar.
Ini adalah beberapa hal yang saya berhasil dapatkan sejauh ini:
- Komit push
- Bekerja dengan cabang
- Integrasikan Github dengan Travis CI, sistem integrasi berkelanjutan
- Melalui Travis CI, secara otomatis bangun setiap komit untuk dikuasai dan letakkan rilis sebagai ZIP di Github di bawah rilis.
Namun saya hanya bekerja pada proyek versi alpha / beta sejauh ini, jadi saya belum pernah melihat rilis versi dalam praktek.
Jadi saya ingin belajar lebih banyak tentang versi, mempertahankan versi yang terpisah, memperbaiki versi, dll.
Bagaimana saya memastikan bahwa hal-hal berikut terjadi:
- Memiliki berbagai versi proyek saya, misalnya versi 1.1.0 dan 2.0.0
- Memiliki kemampuan untuk mendorong perbaikan terbaru pada versi, semacam menabrak versi ke 1.1.1 atau 2.0.1, dll.
- Buat sistem integrasi berkelanjutan membangun versi itu secara otomatis dengan komit dan jika berhasil, kemudian terbitkan rilis untuk versi spesifik itu.
Saya ragu antara opsi berikut:
- Apakah saya perlu menggunakan tag untuk setiap versi? Jika demikian, bagaimana sistem integrasi berkelanjutan membangun rilis secara otomatis?
- Haruskah saya membuat cabang untuk setiap versi? Jika demikian, apakah itu tidak membuat satu ton cabang (seperti cabang 1.1 dan 2.0, hotfix masuk ke cabang itu tentu saja)
- Bagaimana saya menentukan nomor versi? Apakah saya boleh memiliki file konfigurasi yang menentukan nomor versi, atau adakah cara yang lebih cerdas di sekitarnya? Dalam hal ini akan menjadi proyek Java, jika itu penting.
Jawaban:
Anda harus melihat pada git-flow . Ini model percabangan yang sangat baik (dan populer).
Ringkasan Aliran Git
Percabangan
Batang utama yang tetap ada selamanya adalah
develop
danmaster
.master
memegang rilis terbaru Anda dandevelop
memegang salinan pengembangan "stabil" terbaru Anda.Kontributor membuat
feature
cabang (diawali denganfeature/
konvensi) tidak aktif daridevelop
:dan
hotfix
cabang (diawali denganhotfix/
konvensi) tidak aktif darimaster
:Cabang-cabang ini "sekali pakai", yang berarti mereka memiliki umur yang pendek sebelum mereka digabung kembali ke batang utama. Mereka dimaksudkan untuk merangkum fungsionalitas kecil.
Cabang Finishing
Ketika seorang kontributor selesai dengan
feature
cabang, mereka menggabungkannya kembali menjadidevelop
:Ketika mereka selesai dengan
hotfix
cabang, mereka menggabungkannya kembali ke keduamaster
dandevelop
begitu perbaikan terbaru membawa maju:Ini adalah aspek integrasi berkelanjutan.
Rilis
Saat Anda siap untuk mulai mengemas rilis, Anda membuat
release
cabang dari cabang "stabil" Andadevelop
(sama seperti membuatfeature
cabang). Anda kemudian menabrak nomor versi di tag (dijelaskan di bawah)Menggunakan
release
cabang terpisah memungkinkan Anda untuk terus mengembangkan fitur-fitur barudevelop
saat Anda memperbaiki bug dan menambahkan sentuhan akhir padarelease
cabang.Saat Anda siap untuk menyelesaikan rilis, Anda menggabungkan
release
cabang menjadi keduanyamaster
dandevelop
(seperti ahotfix
) sehingga semua perubahan Anda diteruskan.Memberi tag
Saat Anda membuat
release
cabang atauhotfix
cabang, Anda menabrak nomor versi dengan tepat dalam tag. Dengan vanilla git, yang terlihat seperti ini:Anda kemudian juga harus mendorong tag (secara terpisah) ke repositori jarak jauh Anda:
Biasanya lebih baik menggunakan versi semantik di mana versi Anda mengambil formulir
major.minor.hotfix
. Benjolan utama tidak kompatibel ke belakang, sedangkan benjolan kecil dan hotfix tidak kompatibel ke belakang (kecuali Anda dalam beta,0.x.x
).Penggabungan
Seperti yang Anda lihat di atas, git-flow mendorong Anda untuk menggabungkan cabang dengan perintah berikut:
The
--no-ff
pilihan memungkinkan Anda untuk memelihara semua sejarah cabang Anda tanpa meninggalkan sekelompok cabang tergeletak di saat komit dari repositori (sehingga tidak ada kekhawatiran, Anda tidak akan memiliki cabang untuk setiap versi).Anda juga didorong untuk melakukannya
Jadi, Anda tidak menambahkan banyak komitmen gabungan yang tidak berguna.
Anda dapat mengkonfigurasi git untuk melakukan kedua hal ini secara default di
.gitconfig
. Aku akan membiarkanmu melihatnya;)Versi penjelajahan
Ketika seseorang mencari versi tertentu dari basis kode Anda, mereka dapat memeriksa tag dengan nama:
Atau, jika seseorang menjelajah di github, ada juga tab "tag" di menu tarik-turun "cabang".
Menggunakan ekstensi git-flow (disarankan)
Cara favorit saya untuk menggunakan model ini adalah dengan ekstensi aliran git untuk git.
( Sunting: Louis merekomendasikan garpu AVH yang berfungsi lebih baik
git describe
dan mungkin lebih aktif sekarang. Terima kasih Louis.)Ekstensi mengotomatiskan semua bagian yang berantakan (seperti menggunakan
merge --no-ff
dan menghapus cabang setelah penggabungan) sehingga Anda dapat melanjutkan hidup Anda.Misalnya, dengan ekstensi, Anda dapat membuat cabang fitur seperti:
dan selesaikan seperti itu
Perintah untuk perbaikan terbaru dan rilis serupa, meskipun mereka menggunakan nomor versi sebagai pengganti nama cabang, seperti:
Git flow kemudian membuat tag versi untuk Anda dan dengan ramah mengingatkan Anda untuk menabrak versi dalam konfigurasi atau file manifes (yang bisa Anda lakukan dengan task manager seperti grunt).
Semoga itu bisa membantu :) Saya tidak yakin persis bagaimana Anda akan mengintegrasikan semuanya dengan pengaturan Travis CI Anda, tapi saya kira githooks akan membawa Anda ke sana.
sumber
v0.3.0
, di untuk<release>
git flow release start <release> [<base>]
. Di bawah tenda, itu akan membuat nama cabang termasuk versi, sepertirelease/v0.3.0
.Apakah saya perlu menggunakan tag untuk setiap versi?
Tidak, Anda tidak perlu menggunakan tag sama sekali. Jika Anda ingin menandai setiap rilis, tidak apa-apa, atau jika Anda ingin menandai setiap kali sistem CI Anda dibuat, Anda bisa melakukannya juga. Tag pada dasarnya hanya memberikan nama yang ramah pengguna untuk komit, sehingga Anda dapat dengan mudah menariknya dan melihatnya nanti.
Haruskah saya membuat cabang untuk setiap versi?
Yakin! Bercabang murah / gratis di Git, jadi saya memanfaatkan setiap kesempatan yang saya dapatkan. Anda juga dapat menggabungkan dan menghapus cabang dengan cukup cepat. Jika Anda merasa bahwa Anda harus memiliki banyak cabang, Anda selalu dapat memotongnya nanti dengan beberapa penggabungan selektif. Ada banyak skema percabangan Git yang tersedia juga jika Anda ingin menggunakan skema yang dicoba dan benar.
Bagaimana saya menentukan nomor versi?
Tag biasanya adalah cara Anda menentukan nomor versi, karena berkaitan dengan git. Jika Anda berbicara tentang cara membuat versi suatu proyek, atau cara terbaik untuk melakukannya, Anda harus melakukan penggalian, karena itu pertanyaan yang cukup berdasarkan pendapat. Beberapa proyek tetap dalam Beta selamanya, yang lain menambah versi jumlah keseluruhan seperti mereka akan keluar dari gaya (Melihat Anda chrome)
sumber
Jika menurut "versi" yang Anda maksud adalah set file yang merupakan rilis atau kandidat rilis, maka saya sangat menyarankan untuk menandai setiap versi. Jika Anda perlu merujuk ke versi 1.2.7 di ujung jalan, apakah Anda ingin berburu hash komit atau hanya menggunakan nomor versi?
Juga jika Anda gunakan
git describe
untuk merekam informasi bangunan di suatu tempat (seperti yang saya lakukan), maka menggunakan tag memungkinkan untuk memberikan hasil yang lebih baik.Sistem integrasi berkelanjutan dapat membuat rilis terlepas dari bagaimana Anda menggunakan tag. Anda bisa memerintahkannya untuk membuat rilis berdasarkan hash komit. Tag membuat hidup Anda lebih mudah.
Saya tidak melihat percabangan sebagai hal "per-versi". Saya punya beberapa proyek di mana versi saya semua dilakukan di
master
cabang. Saya tidak perlu hal yang lebih rumit dari ini untuk saat ini karena tidak ada proyek pada tahap stabil dan tidak perlu mendukung versi yang lebih lama dalam jangka waktu lama. Tetapi katakanlah saya merilis 1.0, 1.1, 1.2, kemudian saya merilis 2.0 dan saya masih harus mendukung seri 1.0 dengan perbaikan keamanan, dll. Maka saya pasti memiliki cabang untuk menempatkan rilis pemeliharaan untuk seri 1.x .Memiliki satu sumber untuk nomor versi Anda, seperti file konfigurasi, adalah cara terbaik karena mencegah kesalahan besar yang bisa terjadi jika Anda harus memperbarui nomor di sejumlah tempat. Saya berbicara dari ... hmm ... pengalaman memalukan. Anda merilis 1.3 hanya untuk menemukan bahwa perangkat lunak masih melaporkan bahwa itu adalah versi 1.2. Ups!
Dalam jawaban lain, mxdubois merekomendasikan gitflow kepada Anda. Jika Anda memutuskan untuk menggunakan gitflow, saya akan merekomendasikan menggunakan edisi AVH . Versi asli tidak lagi dipelihara secara aktif. Satu perbedaan penting adalah bahwa edisi AVH melakukan penggabungan rilis yang memungkinkan
git describe
untuk bekerja secara cerdas. Versi asli melakukan penggabungan dengan cara yang menjelajahgit describe
.sumber
Memindai daftar Anda, saya melihat versi sebagai fokus Anda, jadi ...
Salah satu cara untuk mempertahankan versi adalah dengan cabang dan penggabungan (atau rebasing).
Jadi kamu punya:
maka Anda membuat cabang
lalu Anda menambahkan lebih banyak perubahan ke
maka Anda membuat cabang
lalu Anda menambahkan lebih banyak perubahan ke
Sekarang:
Untuk memperbarui Versi 2 sekarang Anda lakukan
Untuk memperbarui versi 3
Di atas adalah untuk pembaruan grosir.
Meskipun demikian, kemungkinan besar Anda ingin memilih perubahan khusus untuk itu
Lebih lanjut tentang memetik ceri di http://git-scm.com/docs/git-cherry-pick
sumber