git tagのpushは明示的にtagnameを指定しよう
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株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください! ※エンジニア以外も記事を投稿することがあります
Discussion