Mengapa saya harus menggunakan tag vs. rilis / cabang beta untuk pembuatan versi?

114

Saya telah menggunakan git selama sekitar satu tahun dan ingin menggunakan penandaan untuk, yah, memberi tag pada versi yang berbeda. Saya telah menemukan banyak info tentang perintah yang akan digunakan untuk bekerja dengan tag, tetapi yang ingin saya ketahui adalah mengapa menggunakan penandaan sama sekali jika saya bisa membuat cabang baru yang disebut 1.1.0dan tidak harus mengaburkan pikiran saya secara keseluruhan kumpulan perintah git baru?

Harus ada banyak alasan bagus untuk memberi tag daripada bercabang, tetapi saya ingin tahu apa keuntungannya.

wufoo
sumber

Jawaban:

96

Tag terutama digunakan untuk referensi di masa mendatang ke versi tertentu dari proyek, dengan menandai komit. Anda selalu dapat menggunakan cabang tentu saja, tetapi jika Anda banyak mengubah versi, Anda akan mendapatkan banyak cabang yang tidak terpakai atau jarang digunakan.

Praktisnya, tag adalah cabang tanpa cabang, hanya menambahkan cara untuk mereferensikan versi tertentu dari proyek untuk mengurangi kerumitan.

Sunting: Ini adalah cara yang bagus untuk menggunakan git yang saya gunakan untuk semua proyek saya.

Hakan Deryal
sumber
Heh (: Ini benar-benar alur kerja yang bagus yang mencakup semua solusi yang mungkin.
Hakan Deryal
ya, saya pernah melihat metode nvie sebelumnya dan cukup bingung karenanya. Meskipun demikian, saya bercita-cita untuk menerapkannya begitu saya memahaminya. Saya kira dengan sebuah tag, Anda tidak dapat secara tidak sengaja mengubah kode, melakukan, dan tetap menggunakan versi yang sama. Dengan cabang, itu mungkin terjadi secara tidak sengaja. Tag tampaknya menjadi cara yang lebih aman untuk menandai rilis.
wufoo
2
Keindahan metode nvie bagi saya adalah saya tidak perlu memahaminya pada awalnya. Saya hanya dapat menemukan bagian untuk apa yang ingin saya lakukan dan mengetikkan perintahnya. Setelah beberapa kali menjadi alami dan dalam beberapa hari saya menari di sekitar cabang seperti seorang profesional!
Killroy
Berharap untuk memahami pendekatan gitflow hanya dengan menerapkannya secara membabi buta akan membuat Anda kehilangan semua penyederhanaan yang dapat Anda terapkan untuk situasi Anda. Dan gitflow memang tidak sesuai untuk sebagian besar tim: terlalu rumit, atau terlalu sederhana.
toolforger
151

Tag tidak dapat diubah .

Sementara Anda dapat membuat cabang bernama "1.0.0" - Anda, atau siapa pun yang memiliki hak commit, juga dapat langsung mendorong ke cabang tersebut (sengaja atau tidak) dan mengubah arti 1.0.0.

Anda tidak dapat melakukannya dengan tag, setelah Anda membuat tag - hanya itu; Tag 1.0.0 artinya persis seperti itu dan tidak dapat diubah * .

Itulah perbedaan praktis utama antara tag dan cabang

* Anda dapat menghapus dan membuat ulang sebuah tag dengan demikian mengubah sebuah tag, tetapi tentunya tidak secara tidak sengaja.

AD7six
sumber
18

Saya cenderung menggunakan alur kerja yang menggabungkan tag dan cabang. Tag bagus untuk menandai kode yang dirilis atau build pengembangan yang terkenal. Cabang bagus untuk melacak semua perubahan yang relevan dengan versi tertentu.

Berikut adalah artikel bagus tentang jenis alur kerja ini: http://nvie.com/posts/a-successful-git-branching-model/

Justin ᚅᚔᚈᚄᚒᚔ
sumber
18

Cabang dan tag adalah hal yang sama (penunjuk ke komit, alias. "Ref" ), kecuali cabang secara otomatis pindah ke komit berikutnya sementara tag tetap selamanya 1 pada komit yang sama.

Saat membuat rilis, Anda biasanya ingin menandai "snapshot" kode dari mana rilis itu dibuat, dan Anda ingin tetap ditandai seperti itu bahkan saat Anda terus mengembangkan kode, jadi Anda akan menggunakan tag.

Jika Anda mencoba menggunakan cabang untuk itu, itu bisa secara tidak sengaja pindah ke komit yang berbeda, dari mana rilis tidak dibuat.


1 Kecuali jika Anda menghapus tag tersebut, tentu saja.

CATATAN: Saya menyadari ini adalah pertanyaan lama, tetapi saya merasa bahwa kesamaan (dan satu perbedaan penting) antara cabang dan tanda belum disempurnakan dalam jawaban lain sejelas mungkin.

Branko Dimitrijevic
sumber
@Downvoter yang terhormat, ada alasan khusus untuk downvote tersebut?
Branko Dimitrijevic
Saya tidak meremehkan jawaban Anda, tetapi apa yang Anda maksud dengan "cabang secara otomatis pindah ke komit berikutnya"? Cabang tidak secara otomatis pindah ke komit apa pun. Menjalankan git commitpembaruan kepala cabang yang diperiksa untuk mereferensikan komit baru, ya, tetapi tidak ada cabang lain yang “secara otomatis” pindah ke komit berikutnya. Anda harus menjelaskan paragraf pertama dari jawaban Anda.
Sikat gigi
1
@ Sikat Gigi Tentu, itulah yang saya maksud dengan "bergerak otomatis". Namun, branch tidak benar-benar "memiliki" setiap komit, bahkan tidak menunjuk ke satu set komit, itu hanya menunjuk ke satu komit (dan sisanya bisa tersirat, terkadang tidak tepat, dengan berjalan di grafik komit). Di bawah git, branch hanyalah file satu baris di bawahnya .git\refs\heads, berisi hash komit. Komit sendiri tidak "mengingat" cabang mana yang membuatnya. Ini berbeda dari Mercurial, misalnya, di mana info cabang dapat ditulis ke dalam metadata komit.
Branko Dimitrijevic
Ya, tetapi banyak orang tidak mengetahuinya - terutama pendatang baru yang bingung tentang berbagai cara yang disarankan secara online untuk melakukan sesuatu dengan Git.
Sikat gigi
6

Anda menggunakan tag untuk mencatat komitmen penting dalam sejarah. "Ini adalah commit tepat yang kami gunakan untuk versi ini pada hari hujan itu ketika server build rusak". Jika Anda menggunakan cabang dan bukan tag, Anda tidak akan pernah tahu komit persis apa yang Anda gunakan. Anda hanya tahu "Kami merilis versi 1.1.0 di suatu tempat di cabang ini", kecuali jika Anda secara manual menuliskan hash yang tepat untuk komit itu, itulah mengapa Anda menggunakan tag di tempat pertama :)

ralphtheninja
sumber
4
Saya pikir dia bermaksud membuat cabang bernama 1.1.0 dan tidak menggunakannya lagi, jadi itu akan mewakili proyek dalam versi bernama.
Hakan Deryal
2

Selain jawaban lainnya, ini 2 sen saya.

Jawaban Singkat: Gunakan tag untuk versi rilis

Jawaban panjang: Saya percaya menggunakan tag untuk versi rilis secara khusus lebih baik daripada menggunakan cabang. Jika Anda perlu memperbarui relase, cukup buat cabang dari komit yang diberi tag dan setelah Anda selesai mengerjakan cabang itu (kemungkinan besar cabang perbaikan terbaru), buat tag baru di kepala cabang baru itu dengan versi baru. Kemudian, gabungkan cabang itu kembali menjadi master / develop karena Anda seharusnya tidak mengubah versi rilis kecuali itu adalah hotfix yang kemungkinan harus digabungkan kembali ke kode sumber Anda. Kemudian hapus cabang itu karena tidak lagi diperlukan. Jika Anda perlu menerapkan perbaikan terbaru lain ke versi baru tersebut, ulangi langkah yang sama.

Lihat bagian dari artikel berikut ini yang menunjukkan cara menggabungkan hotfix dengan alur kerja Git penulis - https://hackernoon.com/a-branching-and-releasing-strategy-that-fits-github-flow-be1b6c48eca2

Wilayah39
sumber