タグ付け

このドキュメントでは、Git におけるタグの概念と git tag コマンドについて説明します。タグとは Git 履歴の特定の時点をポイントする ref です。タグは通常、マークが付いたバージョンリリース (v1.0.1 など) の履歴のある時点をキャプチャするのに使用します。タグとは変更がないブランチのようなものです。ただ、ブランチとは違って作成後にコミット履歴が追加されることはありません。ブランチの詳細については git branch のページを参照してください。このドキュメントではさまざまな種類のタグ、タグの作成方法、すべてのタグの一覧表示、タグの削除、タグの共有などについて取り上げます。

タグの作成

新しいタグを作成するには次のコマンドを実行します。

 git tag  

を、タグが作成される時点のリポジトリの状態を示すセマンティック識別子に置換します。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 tagHEAD が参照しているコミット上にタグを作成します。git tag を特定のコミットの ref として渡すこともできます。この場合、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 pushgit checkout です。これらのコマンドの詳しい使い方についてはそれぞれのページを参照してください。

Git を学ぶ準備はできていますか?

この対話式のチュートリアルをお試しください。

今すぐ始める