Apa perbedaan antara tag beranotasi dan tidak berotot?

333

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?

pengguna462301
sumber
1
@ Thilo Ini bukan duplikat yang tepat. Pertanyaan yang dirujuk adalah tentang kapan akan membuat catatan, bukan tentang bendera terkait.
Todd A. Jacobs
1
Ini dijelaskan dengan sangat baik dalam dokumentasi Git: git-scm.com/book/en/Git-Basics-Tagging
Samy Dindane
TLDR tidak ditandai: komit; beranotasi: komit, penulis, tanggal, (opsional) komentar
Antony Hatchkins

Jawaban:

255

TL; DR

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.

Lebih Lanjut Tentang Tag Ringan

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:

  • Ketika Anda menggunakan 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).
  • Saat Anda menggunakan git tag -a <tagname>, Git akan meminta Anda untuk anotasi kecuali Anda juga telah menggunakan flag -m untuk memberikan pesan.
  • Ketika Anda menggunakan git tag -a -m <msg> <tagname>, Git akan menandai komit dan membubuhi keterangan dengan pesan yang diberikan.
  • Ketika Anda menggunakan 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.

Todd A. Jacobs
sumber
4
Apakah ada perbedaan antara tag "anotasi" dan pesan komit?
Steve Bennett
3
@SteveBennett Ya. Anotasi tag bukan pesan komit. Anda tidak dapat melihatnya dengan git-log (1); Anda perlu menggunakan git-show (1).
Todd A. Jacobs
115
Perbedaan antara tag "beranotasi" dan "ringan" melampaui pesan. Anda dapat memiliki tag beranotasi tanpa pesan ( git tag -a <tag> -m ''), tetapi tag beranotasi selalu memiliki tagger (penulis) dan tanggal .
Piotr Findeisen
1
Sama untuk ku. Tag versi biasanya memiliki pesan yang sangat tidak berguna (bisakah itu mengatakan lebih dari namanya? Untuk apa?) Sayangnya, jawaban ini tidak menyebutkan perbedaan ini.
Piotr Findeisen
44
Hal penting lain yang perlu diperhatikan adalah ketika Anda mendorong tag Anda ke repositori jarak jauh menggunakan git push --follow-tags, hanya tag beranotasi yang akan didorong.
Xatoo
209

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 push --follow-tag hanya akan mendorong tag beranotasi
  • git describe tanpa opsi baris perintah hanya melihat tag beranotasi

Perbedaan internal

  • kedua tag ringan dan beranotasi adalah file di bawahnya .git/refs/tagsyang 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 <[email protected]> 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 komit
    • tag untuk dijelaskan, karena ada objek tag dalam kasus itu
  • Daftar hanya tag ringan: Bagaimana saya bisa mendaftar semua tag ringan?

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
1
Ini jauh lebih jelas daripada jawaban yang saat ini diterima. Terima kasih.
Reece
43

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.

Luis
sumber