web-dev-qa-db-ja.com

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

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

git tag <tagname>

そして

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

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

234
user462301

TL; DR

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

軽量タグの詳細

documentation :「軽量タグを作成するには、-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フラグを渡して提供されたメッセージを使用したかのように動作します。

基本的には、タグに注釈とそれに関連するその他の情報を持たせるかどうかになります。

182
Todd A. Jacobs

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

man git-tag言う:

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

また、特定の動作は、この推奨事項が有用な方法でそれらを区別します:

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

    軽量タグにはそのような追加情報はなく、開発のために自分で使用するだけなので、必要ありません。

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

内部の違い

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

  • 軽量タグの場合、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 <[email protected]> 1411478848 +0200
    
    msg
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.11 (GNU/Linux)
    
    <YOUR PGP SIGNATURE>
    -----END PGP SIGNAT
    

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

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

ボーナス

bigの違いは完全に説明されています here

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

whoタグ付きwhatおよびwhenが必要な場合は、注釈付きタグを使用します。 開発の特定のポイントにタグを付けたいの場合、誰がいつそれを行ったとしても、軽量タグで十分です。

通常は注釈付きタグを使用しますが、実際にはプロジェクトのGitマスター次第です。

29
Luis