注釈付きタグと注釈なしタグの違いは何ですか?


333

現在のコミットにタグを付けたい場合。次のコマンドラインの両方が機能することを知っています:

git tag <tagname>

そして

git tag -a <tagname> -m '<message>'

これらのコマンドの違いは何ですか?



1
@Thiloこれは正確な複製ではありません。参照される質問は、関連するフラグではなく、いつ注釈を付けるかについてです。
トッドA.ジェイコブス

1
これはGitのドキュメントで非常によく説明されています:git-scm.com/book/en/Git-Basics-Tagging
Samy Dindane

注釈なしのTLDR:コミット。注釈付き:コミット、作成者、日付、(オプション)コメント
Antony Hatchkins

回答:


255

TL; DR

コマンドの違いは、1つはタグメッセージを提供し、もう1つは提供しないことです。注釈付きのタグにはgit-show(1)で表示できるメッセージがありますが、注釈なしのタグはコミットへの名前付きポインターにすぎません。

軽量タグの詳細

ドキュメントによると、「軽量のタグを作成するには、-a、-s、または-mオプションを指定せず、タグ名を指定してください」。注釈付きタグにメッセージを書き込むためのいくつかの異なるオプションもあります。

  • を使用するとgit tag <tagname>、Gitは現在のリビジョンでタグを作成しますが、注釈を求めるプロンプトを表示しません。メッセージなしでタグ付けされます(これは軽量タグです)。
  • を使用する場合git tag -a <tagname>、メッセージを提供するために-mフラグも使用していない限り、Gitは注釈を要求します。
  • を使用するとgit tag -a -m <msg> <tagname>、Gitはコミットにタグを付け、提供されたメッセージで注釈を付けます。
  • を使用するとgit tag -m <msg> <tagname>、Gitは、注釈に-aフラグを渡して提供されたメッセージを使用するかのように動作します。

基本的には、タグに注釈やその他の情報を関連付けるかどうかだけです。


4
タグ「注釈」とコミットメッセージに違いはありますか?
スティーブベネット

3
@SteveBennettはい。タグの注釈はコミットメッセージではありません。git-log(1)では確認できません。git-show(1)を使用する必要があります。
トッドA.ジェイコブス

115
「注釈付き」タグと「軽量」タグの違いは、メッセージだけではありません。メッセージなしの注釈付きタグ(git tag -a <tag> -m '')を使用できますが、注釈付きタグには常にタガー(作成者)と日付があります
Piotr Findeisen 2013年

1
わたしも。通常、バージョンタグにはかなり役に立たないメッセージが含まれています(名前以上のものはありますか?何のために?)。残念ながら、このトップ投票の回答はこの違いについて言及していません。
Piotr Findeisen 2015

44
もう1つ重要なのは、を使用してタグをリモートリポジトリにプッシュするとgit push --follow-tags、注釈付きのタグのみがプッシュされることです。
Xatoo

209

注釈付きタグをプッシュし、軽量ローカルを維持する

man git-tag 言う:

注釈付きタグはリリース用であり、軽量タグはプライベートまたは一時的なオブジェクトラベル用です。

また、特定の動作は、この推奨事項が役立つ方法でそれらを区別します。例:

  • 注釈付きタグには、メッセージ、作成者、およびそれらが指すコミットとは異なる日付を含めることができます。したがって、リリースコミットを行わずに、それらを使用してリリースを説明できます。

    軽量のタグには追加の情報はなく、開発に自分で使用するだけなので、それを必要としません。

  • git push --follow-tagsは注釈付きタグのみをプッシュします
  • git describe コマンドラインオプションがない場合、注釈付きのタグのみが表示されます

内部の違い

  • 軽量タグと注釈付きタグの両方が.git/refs/tagsSHA-1を含むファイルです

  • 軽量タグの場合、SHA-1はコミットを直接指します。

    git tag light
    cat .git/refs/tags/light
    

    HEADのSHA-1と同じように印刷します。

    したがって、他のメタデータを含めることができないのも不思議ではありません。

  • 注釈付きタグは、オブジェクトデータベース内のタグオブジェクトを指します。

    git tag -as -m msg annot
    cat .git/refs/tags/annot
    

    注釈付きタグオブジェクトのSHAが含まれます。

    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    その後、次のようにしてコンテンツを取得できます。

    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    出力例:

    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
    

    これが追加のメタデータを含む方法です。出力からわかるように、メタデータフィールドは次のとおりです。

    形式の詳細な分析は次の場所にあります:gitタグオブジェクトの形式とそのSHAの計算方法

ボーナス


1
これは、現在受け入れられている回答よりもはるかに明確です。ありがとう。
リース

43

大きな違いは、完全に説明されてここに

基本的に、軽量タグは特定のコミットへのポインタにすぎません。それ以上の情報は保存されません。一方、注釈付きタグ通常のオブジェクトであり、作成者と日付があり、独自のSHAキーがあるため参照できます。

いつタグ付けしたかがわかる場合は、注釈付きタグを使用します。開発の特定のポイントにタグを付けるだけの場合は、誰がいつ行ったかに関係なく、軽量のタグで十分です。

通常は注釈付きのタグを使いますが、それはプロジェクトのGitマスター次第です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.