git tagのpushは明示的にtagnameを指定しよう

2025/01/03に公開

TL;DR

git tagをremoteにpushするときはgit push origin [tagname] で明示的にタグを指定しましょう。

はじめに

gitのtag付けはリリース管理に有用です。
タグ付けはgit tag -a [tagname]で簡単に行うことができます。
コマンドを実行すると、メッセージを入力して、現在のコミットにタグ付けがなされます。
これをremoteにpushしようとして、git push origin HEADを行っても、originにはtagが同期されません。

どうすればよいか?

先述の通り、通常のgit pushコマンドではタグは同期されません。
タグを同期するには次の2つの方法があります。

1. --tagsオプションを用いる

git push origin --tagsとtagsオプションを用いることで、ローカルのすべてのタグが同期されます。
すべてのというのがポイントであり、意図しないタグも同期されるリスクがあります。

2. タグを明示的に指定する

git push origin [tagname]とタグ名を明示的に指定してpushすると、当該タグが同期されます。

なぜgit pushでtagが同期されないか

なぜpushで同期されないのでしょうか。
git bookによると、tagは

多くの VCS と同様に Git にもタグ機能があり、歴史上の重要なポイントに印をつけることができます。よくあるのは、この機能を (v 1.0など) リリースポイントとして使うことです。

とあります。ここから
「タグは重要な情報であり、リリース等と関連していることがあるため、ブランチの操作とは独立して行いたい」
ということが考えられます。

また、git pushはブランチの操作が主目的であり、暗黙的にタグの共有が含まれると単一責務に反する、といったことも考えられます。

おまけ:注釈付きタグと軽量タグ

タグを付与するとき、git tag -a [tagname]-aオプションを付ける形を上述しました。これは--anotateオプションで、注釈付きタグと呼ばれます。
オプション無しのgit tag [tagname]を軽量タグといいます。
Gitのtagは.git/refs/tagsディレクトリ下に置かれます。
軽量タグの場合、作成されるのはタグ名をファイル名として、当該コミットへのポインタのみです。
注釈付きタグの場合は、gitオブジェクトが作成され、だれがいつタグ付けを行ったかの情報が保存されます。
タグの情報はgit show [tagname]で確認できます。
そのためgit bookでは注釈付きタグを推奨し、軽量タグは一時的な利用に留めるように書かれています。

NCDCエンジニアブログ

Discussion