Bagaimana cara menggunakan github, cabang, dan rilis otomatis untuk manajemen versi? [Tutup]

24

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.
skiwi
sumber
3
Seperti yang ada, ini adalah pertanyaan yang agak luas tentang keseluruhan Git. Ada sejumlah dari pertanyaan yang berkaitan dengan topik ini bahwa Anda mungkin ingin menelusuri. Mungkin membaca beberapa di antaranya dan mempersempitnya atau membaginya sehingga dapat dijawab tanpa menulis buku.
Ampt
Lihat sedikit judul untuk mencerminkan konten.
Michael Durrant
1
Saya akan menunjukkan bahwa ketika saya dapat menemukan banyak, dan lebih banyak (saya kehabisan kamar), kemungkinan duplikat untuk pertanyaan individu dalam pertanyaan ini saya percaya pertanyaan keseluruhan sedikit di sisi 'terlalu luas'.
"Pertanyaan Anda harus dibatasi ..." ( pusat bantuan ). Lihat meta.programmers.stackexchange.com/questions/6483/...
gnat

Jawaban:

42

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 developdan master. mastermemegang rilis terbaru Anda dan developmemegang salinan pengembangan "stabil" terbaru Anda.

Kontributor membuat featurecabang (diawali dengan feature/konvensi) tidak aktif dari develop :

$ git checkout -b feature/my-feature develop

dan hotfixcabang (diawali dengan hotfix/konvensi) tidak aktif dari master:

# hotfix the latest version of master
$ git checkout -b hotfix/hotfix-version-number master

# or hotfix from a specific version
$ git checkout -b hotfix/hotfix-version-number <starting-tag-name>

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 featurecabang, mereka menggabungkannya kembali menjadi develop:

$ git checkout develop
$ git merge --no-ff feature/my-feature
$ git branch -d feature/my-feature

Ketika mereka selesai dengan hotfixcabang, mereka menggabungkannya kembali ke kedua masterdan developbegitu perbaikan terbaru membawa maju:

$ git checkout master
$ git merge --no-ff hotfix/hotfix-version-number
$ git checkout develop
$ git merge --no-ff hotfix/hotfix-version-number
$ git branch -d hotfix/hotfix-version-number

Ini adalah aspek integrasi berkelanjutan.

Rilis

Saat Anda siap untuk mulai mengemas rilis, Anda membuat releasecabang dari cabang "stabil" Anda develop(sama seperti membuat featurecabang). Anda kemudian menabrak nomor versi di tag (dijelaskan di bawah)

Menggunakan releasecabang terpisah memungkinkan Anda untuk terus mengembangkan fitur-fitur baru developsaat Anda memperbaiki bug dan menambahkan sentuhan akhir pada releasecabang.

Saat Anda siap untuk menyelesaikan rilis, Anda menggabungkan releasecabang menjadi keduanya masterdan develop(seperti a hotfix) sehingga semua perubahan Anda diteruskan.

Memberi tag

Saat Anda membuat releasecabang atau hotfixcabang, Anda menabrak nomor versi dengan tepat dalam tag. Dengan vanilla git, yang terlihat seperti ini:

$ git tag -a <tag-name> -m <tag-description>

Anda kemudian juga harus mendorong tag (secara terpisah) ke repositori jarak jauh Anda:

$ git push --tags

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:

$ git merge --no-ff <branch-name>

The --no-ffpilihan 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

$ git pull --rebase

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:

# checkout in detached HEAD to browse
$ git checkout <tag-name>

# OR checkout and create a new local branch (as you might for a hotfix)
$ git checkout -b <new-branch-name> <tag-name>

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 describedan mungkin lebih aktif sekarang. Terima kasih Louis.)

Ekstensi mengotomatiskan semua bagian yang berantakan (seperti menggunakan merge --no-ffdan menghapus cabang setelah penggabungan) sehingga Anda dapat melanjutkan hidup Anda.

Misalnya, dengan ekstensi, Anda dapat membuat cabang fitur seperti:

$ git flow feature start my-feature-name

dan selesaikan seperti itu

$ git flow feature finish my-feature-name

Perintah untuk perbaikan terbaru dan rilis serupa, meskipun mereka menggunakan nomor versi sebagai pengganti nama cabang, seperti:

# Create hotfix number 14 for this minor version.
$ git flow hotfix start 2.4.14

# Create the next release
$ git flow release start 2.5.0

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.

mxdubois
sumber
Saat memulai cabang rilis, apakah Anda menggunakan string literal yang sama 'rilis' seperti nama cabang untuk setiap rilis, atau sesuatu yang spesifik versi seperti 'v0.3.0'? Instruksi ini sangat bagus dan saya akan berusaha untuk mengikuti mereka ke surat itu, tetapi saya tidak ingin mengacaukan aspek ini.
Paul
1
Menggunakan perintah plugin git flow, Anda akan meletakkan pengenal versi, seperti v0.3.0, di untuk <release> git flow release start <release> [<base>]. Di bawah tenda, itu akan membuat nama cabang termasuk versi, seperti release/v0.3.0.
mxdubois
3

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)

Ampt
sumber
3

Apakah saya perlu menggunakan tag untuk setiap versi?

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 describeuntuk merekam informasi bangunan di suatu tempat (seperti yang saya lakukan), maka menggunakan tag memungkinkan untuk memberikan hasil yang lebih baik.

Jika demikian, bagaimana sistem integrasi berkelanjutan membangun rilis secara otomatis?

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.

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)

Saya tidak melihat percabangan sebagai hal "per-versi". Saya punya beberapa proyek di mana versi saya semua dilakukan di mastercabang. 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 .

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.

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 describeuntuk bekerja secara cerdas. Versi asli melakukan penggabungan dengan cara yang menjelajahgit describe .

Louis
sumber
0

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:

master

maka Anda membuat cabang

v1

lalu Anda menambahkan lebih banyak perubahan ke

master(diff1)

maka Anda membuat cabang

v3

lalu Anda menambahkan lebih banyak perubahan ke

master(diff2)

Sekarang:

Untuk memperbarui Versi 2 sekarang Anda lakukan

git checkout v2
git merge master  # for the changes you want to bring into version 2
# rebasing is also an option
# resolve any merge conflicts
# Done.

Untuk memperbarui versi 3

git checkout v3
git merge master

Di atas adalah untuk pembaruan grosir.

Meskipun demikian, kemungkinan besar Anda ingin memilih perubahan khusus untuk itu

git cherry-pick

Lebih lanjut tentang memetik ceri di http://git-scm.com/docs/git-cherry-pick

Michael Durrant
sumber