Git
章 ▾ 第2版

2.6 Gitの基本 - タグ付け

タグ付け

ほとんどのVCSと同様に、Gitはリポジトリの履歴内の特定のポイントを重要であるとマークする機能を備えています。一般的に、この機能はリリースポイント(`v1.0`、`v2.0`など)をマークするために使用されます。このセクションでは、既存のタグを一覧表示する方法、タグを作成および削除する方法、およびさまざまな種類のタグについて学習します。

タグの一覧表示

Gitで既存のタグを一覧表示するのは簡単です。`git tag`(オプションで`-l`または`--list`)と入力するだけです。

$ git tag
v1.0
v2.0

このコマンドは、タグをアルファベット順に一覧表示します。表示される順序は実際には重要ではありません。

特定のパターンに一致するタグを検索することもできます。たとえば、Gitソースリポジトリには500を超えるタグが含まれています。1.8.5シリーズのみを確認したい場合は、これを実行できます。

$ git tag -l "v1.8.5*"
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
v1.8.5-rc2
v1.8.5-rc3
v1.8.5.1
v1.8.5.2
v1.8.5.3
v1.8.5.4
v1.8.5.5
注記
ワイルドカードを使ったタグ一覧表示には`-l`または`--list`オプションが必要です。

タグの完全なリストが必要な場合は、`git tag`コマンドを実行すると、暗黙的にリストが表示されます。この場合、`-l`または`--list`の使用はオプションです。

ただし、タグ名に一致するワイルドカードパターンを指定する場合は、`-l`または`--list`の使用が必須です。

タグの作成

Gitは、軽量タグと注釈付きタグの2種類のタグをサポートしています。

軽量タグは、変更されないブランチと非常によく似ており、特定のコミットへのポインタにすぎません。

一方、注釈付きタグは、Gitデータベース内の完全なオブジェクトとして保存されます。チェックサムされ、タグ付け者の名前、メールアドレス、日付が含まれており、タグ付けメッセージがあり、GNU Privacy Guard(GPG)で署名および検証できます。このすべての情報を得ることができるように、注釈付きタグを作成することをお勧めしますが、一時的なタグが必要な場合、または何らかの理由で他の情報を保持したくない場合は、軽量タグも利用できます。

注釈付きタグ

Gitで注釈付きタグを作成するのは簡単です。最も簡単な方法は、`tag`コマンドを実行するときに`-a`を指定することです。

$ git tag -a v1.4 -m "my version 1.4"
$ git tag
v0.1
v1.3
v1.4

`-m`はタグ付けメッセージを指定し、タグと共に保存されます。注釈付きタグにメッセージを指定しない場合、Gitはエディタを起動してメッセージを入力できるようにします。

`git show`コマンドを使用して、タグ付けされたコミットと共にタグデータを確認できます。

$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date:   Sat May 3 20:19:12 2014 -0700

my version 1.4

commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    Change version number

これにより、タグ付け者の情報、コミットがタグ付けされた日付、注釈メッセージが表示され、その後にコミット情報が表示されます。

軽量タグ

コミットにタグ付けするもう一つの方法は、軽量タグを使用することです。これは基本的に、ファイルに保存されたコミットのチェックサムであり、他の情報は保存されません。軽量タグを作成するには、-a-s-mオプションを指定せず、タグ名だけを指定します。

$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5

今回は、タグに対してgit showを実行しても、追加のタグ情報は表示されません。コマンドはコミットだけを表示します。

$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    Change version number

後からのタグ付け

既にコミットを過ぎた後でも、コミットにタグ付けできます。コミット履歴が次のようになっているとします。

$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 Create write support
0d52aaab4479697da7686c15f77a3d64d9165190 One more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc Add commit function
4682c3261057305bdd616e23b64b0857d832627b Add todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a Create write support
9fceb02d0ae598e95dc970b74767f19372d61af8 Update rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc Commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a Update readme

さて、「Update rakefile」コミットにあったプロジェクトのv1.2へのタグ付けを忘れていたとします。後で追加することができます。そのコミットにタグ付けするには、コマンドの最後にコミットチェックサム(またはその一部)を指定します。

$ git tag -a v1.2 9fceb02

コミットにタグ付けされたことがわかります。

$ git tag
v0.1
v1.2
v1.3
v1.4
v1.4-lw
v1.5

$ git show v1.2
tag v1.2
Tagger: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Feb 9 15:32:16 2009 -0800

version 1.2
commit 9fceb02d0ae598e95dc970b74767f19372d61af8
Author: Magnus Chacon <mchacon@gee-mail.com>
Date:   Sun Apr 27 20:43:35 2008 -0700

    Update rakefile
...

タグの共有

デフォルトでは、git pushコマンドはタグをリモートサーバーに転送しません。作成した後に、タグを共有サーバーに明示的にプッシュする必要があります。このプロセスはリモートブランチの共有と同様です。git push origin <tagname>を実行できます。

$ git push origin v1.5
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@github.com:schacon/simplegit.git
 * [new tag]         v1.5 -> v1.5

一度にプッシュしたいタグがたくさんある場合は、git pushコマンドに--tagsオプションを使用することもできます。これにより、まだ存在していないすべてのタグがリモートサーバーに転送されます。

$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
 * [new tag]         v1.4 -> v1.4
 * [new tag]         v1.4-lw -> v1.4-lw

これで、他のユーザーがリポジトリをクローンまたはプルすると、すべてのタグも取得します。

注記
git pushは両方のタイプのタグをプッシュします。

git push <remote> --tagsは、軽量タグと注釈付きタグの両方をプッシュします。現在、軽量タグのみをプッシュするオプションはありませんが、git push <remote> --follow-tagsを使用すると、注釈付きタグのみがリモートにプッシュされます。

タグの削除

ローカルリポジトリからタグを削除するには、git tag -d <tagname>を使用できます。例えば、上記の軽量タグを次のように削除できます。

$ git tag -d v1.4-lw
Deleted tag 'v1.4-lw' (was e7d5add)

これは、リモートサーバーからタグを削除するものではないことに注意してください。リモートサーバーからタグを削除するための一般的なバリエーションが2つあります。

最初のバリエーションはgit push <remote> :refs/tags/<tagname>です。

$ git push origin :refs/tags/v1.4-lw
To /git@github.com:schacon/simplegit.git
 - [deleted]         v1.4-lw

上記の解釈方法は、コロンの前にあるnull値がリモートタグ名にプッシュされ、効果的に削除されるものとして読むことです。

リモートタグを削除する2番目(そしてより直感的な)方法は、次のとおりです。

$ git push origin --delete <tagname>

タグのチェックアウト

タグが指しているファイルのバージョンを表示したい場合は、そのタグのgit checkoutを実行できますが、これによりリポジトリは「デタッチされたHEAD」状態になり、いくつかの悪影響があります。

$ git checkout v2.0.0
Note: switching to 'v2.0.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final

$ git checkout v2.0-beta-0.1
Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
HEAD is now at df3f601... Add atlas.json and cover image

「デタッチされたHEAD」状態では、変更を加えてからコミットを作成しても、タグは同じままですが、新しいコミットはどのブランチにも属さず、正確なコミットハッシュ以外では到達不能になります。そのため、変更を加える必要がある場合(たとえば、古いバージョンのバグを修正する場合など)は、一般的にブランチを作成する必要があります。

$ git checkout -b version2 v2.0.0
Switched to a new branch 'version2'

これを行い、コミットを行うと、新しい変更によってversion2ブランチはv2.0.0タグとは少し異なるため、注意してください。

scroll-to-top