git tag
このドキュメントでは、Git におけるタグの概念と git tag コマンドについて説明します。タグとは Git 履歴の特定の時点をポイントする ref です。タグは通常、マークが付いたバージョン リリース (v1.0.1 など) の履歴のある時点をキャプチャするのに使用します。
タグとは変更がないブランチのようなものです。ただ、ブランチとは違って作成後にコミット履歴が追加されることはありません。ブランチの詳細については、git branch のページを参照してください。
このドキュメントでは、さまざまな種類のタグ、タグを作成する方法、すべてのタグを一覧表示する方法、タグを削除する方法、タグ付けされたコミットを表示する git checkout タグやタグを他のユーザーと共有する git push タグなどのコマンドを使用する方法について取り上げます。
Git でタグを作成する方法
新しいタグを作成するには次のコマンドを実行します。
git tag <tagname><tagname> を、タグが作成される時点のリポジトリの状態を示すセマンティック識別子に置換します。git tag v1.4 のようなバージョン番号を使うのが一般的なパターンです。Git では、注釈付きタグと軽量タグの、2 つの異なる種類のタグをサポートしています。先ほどのサンプルでは軽量タグを作成しました。軽量タグと注釈付きタグの違いは、タグに保存されるメタ データの量です。注釈付きタグはみんなで共有するもの、軽量タグは自分専用だと考えるとわかりやすいでしょう。注釈付きタグにはタグ付けプログラムの名前、メール、日付などのメタ データが保存されます。これらは公開リリースで重要になるデータです。軽量タグは本質的にはコミットの「ブックマーク」であり、コミットの名前とポインターに過ぎません。関連するコミットへのクイック リンクを作成するのに便利です。
注釈付きタグ
注釈付きタグは Git データベースに完全なオブジェクトとして保存されます。繰り返しになりますが、注釈付きタグにはタグ付けツールの名前、メール、日付などの追加のメタデータが保存されます。コミットとコミットメッセージ同様、注釈付きタグにはタグ付けメッセージがあります。また、セキュリティ上の理由により、注釈付きタグは GNU Privacy Guard (GPG) による署名と検証を受けることができます。Git のタグ付けでは軽量タグよりも注釈付きタグを優先的に使って関連するすべてのメタデータを保持するようにすると良いでしょう。
git tag -a v1.4このコマンドを実行すると、v1.4 で指定した新しい注釈付きタグを作成します。その後、設定済みのデフォルトのテキスト エディターが起動し、追加のメタ データを入力するよう求められます。
git tag -a v1.4 -m "my version 1.4"このコマンドを実行すると、1 つ前の呼び出しと同じような結果が得られますが、このバージョンのコマンドでは -m オプションとメッセージが渡されています。これは git commit -m と同じように便利な方法で、即座に新しいタグを作成して、-m オプションを使って渡されるメッセージを表示するために、ローカルのテキスト エディターを起動しません。
軽量タグ
git tag v1.4-lwこのコマンドを実行すると v1.4-lw で指定した軽量タグを作成します。 軽量タグは -a、-s、または -m オプションを指定しなくても作成されます。軽量タグでは新しいタグ チェックサムが作成されて、プロジェクトのリポジトリの .git/ ディレクトリに そのチェックサムが保存されます。
タグの一覧表示
リポジトリに保存されたタグを一覧表示するには以下を実行します。
git tagタグの一覧が出力されます。
v0.10.0
v0.10.0-rc1
v0.11.0
v0.11.0-rc1
v0.11.1
v0.11.2
v0.12.0
v0.12.0-rc1
v0.12.1
v0.12.2
v0.13.0
v0.13.0-rc1
v0.13.0-rc2タグの一覧を絞り込むには、ワイルド カード表現を使って -l を渡します。
$ git tag -l *-rc*
v0.10.0-rc1
v0.11.0-rc1
v0.12.0-rc1
v0.13.0-rc1
v0.13.0-rc2
v0.14.0-rc1
v0.9.0-rc1
v15.0.0-rc.1
v15.0.0-rc.2
v15.4.0-rc.3上のサンプルでは -l オプションとワイルドカード表現 -rc を使って -rc のプレフィックスが付いたすべてのタグの一覧を返しています。これは通常、リリース候補を特定するために使用されます。
古いコミットへのタグ付け
前のタグ付けの例では、暗黙的なコミットの操作を説明しました。既定では、git tag は HEAD が参照しているコミット上にタグを作成します。git tag を特定のコミットの参照として渡すこともできます。この場合、HEAD を既定にする代わりに、渡されたコミットにタグを付けます。古いコミットの一覧を集めるには、git log コマンドを実行します。
$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'feature'
a6b4c97498bd301d84096da251c98a07c7723e65 add update method for thing
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'git log を実行するとコミットの一覧が出力されます。このサンプルでは一番上のコミット Merge branch 'feature' を新しいタグとして使います。Git に渡すにはコミット SHA ハッシュを参照する必要があります。
git tag -a v1.2 15027957951b64cf874c3557a0f3547bd83b3ff6上の git tag 呼び出しを実行すると、前の git log サンプルで選択したコミット用に、v1.2 で指定した新しい注釈付きタグが作成されます。
古いタグの再タグ付けと置換
既存のタグと同じ識別子を使ってタグを作成すると、以下のようなエラーが表示されます。
fatal: tag 'v0.4' already existsまた、既存のタグ識別子を使って以前のコミットにタグを付けようとしても同じエラーが表示されます。
既存のタグを更新する必要がある場合は、-f FORCE オプションを使う必要があります。
git tag -a -f v1.4 15027957951b64cf874c3557a0f3547bd83b3ff6上のコマンドを実行すると、15027957951b64cf874c3557a0f3547bd83b3ff6 コミットを v1.4 のタグ識別子にマッピングします。v1.4 タグの既存のコンテンツはすべて上書きされます。
共有:タグをリモートにプッシュする
タグの共有はブランチのプッシュと似ています。デフォルトでは、git push でタグはプッシュされません。タグは明示的に git push に渡す必要があります。
$ git push origin v1.4
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To git@bitbucket.com:atlasbro/gittagdocs.git
* [new tag] v1.4 -> v1.4複数のタグを同時にプッシュするには --tags オプションを git push コマンドに渡します。別のユーザーがリポジトリをクローンまたはプルすると、新しいタグを受け取ります。
タグのチェックアウト
git checkout コマンドを使うと、タグのリポジトリの状態を表示できます。
git checkout v1.4上のコマンドでは v1.4 タグをチェックアウトしています。これによってリポジトリは detached HEAD 状態になります。つまり、どの変更もタグを更新しないということです。これによって分離した新たなコミットが作成されます。新たに分離したコミットはどのブランチにも属さず、直接到達できるのはコミット SHA ハッシュからだけです。そのため、detached HEAD 状態で変更を加えたときは毎回新しいブランチを作成することが推奨されます。
タグの削除
タグの削除はいたってシンプルな操作です。-d オプションとタグ識別子を git tag に渡すと、指定したタグが削除されます。
$ git tag
v1
v2
v3
$ git tag -d v1
$ git tag
v2
v3このサンプルでは git tag を実行して v1、v2、v3 のタグ一覧を表示しています。その後、git tag -d v1 を実行して v1 タグを削除しています。
要約
まとめると、タグ付けとは Git リポジトリのスナップショットを作成するための追加のメカニズムということになります。タグ付けは従来、ソフトウェア リリースのサイクルに対応するセマンティック バージョン番号識別タグを作成するために使用されて来ました。git tag は、作成、修正、削除など、タグの操作の基本となるコマンドです。タグには注釈付きと軽量の 2 種類があります。注釈付きタグには、タグに関する重要な追加のメタデータを保存できるため、ほとんどのケースに適しています。このドキュメントで取り上げた追加の Git コマンドは git push と git checkout です。これらのコマンドの詳しい使い方については、それぞれのページを参照してください。