Jika saya ingin menandai komit saat ini. Saya tahu kedua baris perintah berikut berfungsi:
git tag <tagname>
dan
git tag -a <tagname> -m '<message>'
Apa perbedaan antara perintah-perintah ini?
Jika saya ingin menandai komit saat ini. Saya tahu kedua baris perintah berikut berfungsi:
git tag <tagname>
dan
git tag -a <tagname> -m '<message>'
Apa perbedaan antara perintah-perintah ini?
Jawaban:
Perbedaan antara perintah adalah bahwa yang satu memberi Anda pesan tag sementara yang lain tidak. Tag beranotasi memiliki pesan yang dapat ditampilkan dengan git-show (1), sementara tag tanpa anotasi hanyalah penunjuk bernama untuk komit.
Menurut dokumentasi : "Untuk membuat tag yang ringan, jangan berikan opsi -a, -s, atau -m, cukup berikan nama tag". Ada juga beberapa opsi berbeda untuk menulis pesan pada tag beranotasi:
git tag <tagname>
, Git akan membuat tag pada revisi saat ini tetapi tidak akan meminta Anda untuk anotasi. Ini akan ditandai tanpa pesan (ini adalah tag yang ringan).git tag -a <tagname>
, Git akan meminta Anda untuk anotasi kecuali Anda juga telah menggunakan flag -m untuk memberikan pesan.git tag -a -m <msg> <tagname>
, Git akan menandai komit dan membubuhi keterangan dengan pesan yang diberikan.git tag -m <msg> <tagname>
, Git akan berperilaku seolah-olah Anda melewati tanda -a untuk penjelasan dan menggunakan pesan yang disediakan.Pada dasarnya, itu hanya berarti apakah Anda ingin tag memiliki anotasi dan beberapa informasi lain yang terkait dengannya atau tidak.
git tag -a <tag> -m ''
), tetapi tag beranotasi selalu memiliki tagger (penulis) dan tanggal .
git push --follow-tags
, hanya tag beranotasi yang akan didorong.
Dorong tag beranotasi, pertahankan lokal yang ringan
man git-tag
mengatakan:
Tag beranotasi dimaksudkan untuk rilis sementara tag ringan dimaksudkan untuk label objek pribadi atau sementara.
Dan perilaku tertentu memang membedakan mereka dengan cara-cara yang berguna misalnya rekomendasi ini:
tag beranotasi dapat berisi pesan, pembuat, dan tanggal yang berbeda dari komit yang dituju. Jadi, Anda bisa menggunakannya untuk menjelaskan rilis tanpa membuat komit rilis.
Tag ringan tidak memiliki informasi tambahan itu, dan tidak memerlukannya, karena Anda hanya akan menggunakannya sendiri untuk dikembangkan.
git describe
tanpa opsi baris perintah hanya melihat tag beranotasiPerbedaan internal
kedua tag ringan dan beranotasi adalah file di bawahnya .git/refs/tags
yang berisi SHA-1
untuk tag ringan, SHA-1 menunjuk langsung ke komit:
git tag light
cat .git/refs/tags/light
mencetak sama dengan HEA's SHA-1.
Jadi tidak heran mereka tidak dapat mengandung metadata lainnya.
tag beranotasi mengarah ke objek tag dalam database objek.
git tag -as -m msg annot
cat .git/refs/tags/annot
berisi SHA dari objek tag beranotasi:
c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
dan kemudian kita bisa mendapatkan kontennya dengan:
git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
output sampel:
object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
type commit
tag annot
tagger Ciro Santilli <your@mail.com> 1411478848 +0200
msg
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
<YOUR PGP SIGNATURE>
-----END PGP SIGNAT
Dan ini caranya mengandung metadata tambahan. Seperti yang bisa kita lihat dari output, bidang metadata adalah:
Analisis format yang lebih terperinci terdapat di: Apa format objek tag git dan bagaimana cara menghitung SHA-nya?
Bonus
Tentukan apakah tag dianotasi:
git cat-file -t tag
Keluaran
commit
untuk yang ringan, karena tidak ada objek tag, itu menunjuk langsung ke komittag
untuk dijelaskan, karena ada objek tag dalam kasus ituDaftar hanya tag ringan: Bagaimana saya bisa mendaftar semua tag ringan?
Perbedaan besar dijelaskan dengan sempurna di sini .
Pada dasarnya, tag ringan hanyalah petunjuk untuk komit tertentu. Tidak ada informasi lebih lanjut yang disimpan ; di sisi lain, tag beranotasi adalah objek biasa , yang memiliki penulis dan tanggal dan dapat dirujuk karena mereka memiliki kunci SHA mereka sendiri.
Jika mengetahui siapa yang menandai apa dan kapan relevan bagi Anda, maka gunakan tag yang dianotasi. Jika Anda hanya ingin menandai titik tertentu dalam pengembangan Anda , tidak peduli siapa dan kapan melakukannya, maka tag ringan cukup baik.
Biasanya Anda akan mencari tag beranotasi, tetapi itu sepenuhnya tergantung pada master Git dari proyek tersebut.