2014/03/17更新

[Git] 3種類のタグについて

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
Gitのタグには3種類あるって、知ってましたか?今日は、それらのタグについてブログを書きたいと思います。

画像

Special Thanks to http://flic.kr/p/BEMhr



このブログで伝えたいこと

このブログでは、Gitのタグについて解説しています。 この記事を最後まで読むことで、Gitに存在するタグの種類を知り、それらを作成/利用/共有/削除する方法を学ぶことができます。



Gitで利用できるタグの種類

Gitで利用できるタグには以下の3種類が存在します。

  • 軽量版のタグ
  • 注釈付きのタグ
  • 署名付きのタグ

※上記名称は、git-scm.comから引用しています。


以降では、それぞれの機能や作成方法を説明します。



軽量版のタグ

軽量版のタグは、その名前の通り、タグに持たせる情報が一番軽量なタグです。 他のタグとは異なり、ある特定のコミットに対して何か名前をつけるために利用します。以下のように作成します。
$ git tag my-light-tag-01
上記のコマンドでは、現在のHEADが指すコミットに対して「my-light-tag-01」というタグを作成しました。 作成したタグを確認するには、以下のように行います。
$ git tag
my-light-tag-01
タグのデータとそれに関連づけられたコミットを見るにはgit showコマンドを使用します。
$ git show
commit 6e6cf849629c6322414ad07d12644710ef48be81
Author: munesada_yohei <y.munesada@gmail.com>
Date:   Wed Jan 22 14:24:02 2014 +0900

    my first commit

diff --git a/aaa.txt b/aaa.txt
new file mode 100644
index 0000000..fb6c63a
--- /dev/null
+++ b/aaa.txt
@@ -0,0 +1,2 @@
+this is a first commit message file.
+
個人的に利用しているレポジトリであれば、このタグも便利でしょう。 しかし、誰がいつ何のために作成したのかといった情報は持っていません。 チーム開発でGitを利用する場合には、次に紹介するタグがより役立つでしょう。



注釈付きタグ

注釈付きタグでは、作成者、作成日、作成メッセージといった情報を追加でタグに保持させることができます。 注釈付きタグは、-aオプションを付与してタグを作成します。
# -mを指定するとコメントも同時に指定することが出来ます.
# -mを付けない場合にはコメント付与を行うためのエディタが立ち上がります.
$ git tag -a annotated-tag-01 -m "my first annotated tag"
作成したタグを確認してみましょう。
$ git tag
annotated-tag-01
my-light-tag-01
先ほどのタグに加え、今回作成したタグもできていますね。タグの中身も見てみましょう。
$ git show annotated-tag-01
tag annotated-tag-01
Tagger: munesada_yohei <y.munesada@gmail.com>
Date:   Sun Mar 16 23:07:05 2014 +0900

my first annotated tag

commit 6e6cf849629c6322414ad07d12644710ef48be81
Author: munesada_yohei <y.munesada@gmail.com>
Date:   Wed Jan 22 14:24:02 2014 +0900

    my first commit

diff --git a/aaa.txt b/aaa.txt
new file mode 100644
index 0000000..fb6c63a
--- /dev/null
+++ b/aaa.txt
@@ -0,0 +1,2 @@
+this is a first commit message file.
+
軽量版タグとは異なり、TaggerやDateなどの情報が表示されていることが分かります。 チーム開発でこのタグを使えば、なぜタグがあるのか、誰が作ったのか、といった情報を得ることができ、便利に開発を進めることができます。 よく、このタグあるけど消しても良いの?という話題がでることもありますが、このタグがあれば少なくとも、作成者や作成日が分かるので、消しても良いのか否かの判断がしやすくなります。

次のタグは、注釈付きタグに署名を加えることができるタグです。



署名付きのタグ

署名付きのタグは、注釈付きのタグの情報に加え、署名を保持することができます。 なぜタグに署名を付ける必要があるのでしょうか。それは、そのタグ(やコミット)に対して信頼性を持たせるためです。 顔の知れた仲間同士で開発をしていればこのような署名は不要かもしれませんが、OSSなど全く知らない人も含まれた開発をする際には、署名付きのタグも利用シーンがあるかもしれません。
Gitは、レポジトリが個人毎に存在するため、そのレポジトリに対するユーザー設定は各個人が行います。そのため、なりすましをしようと思えば出来てしまいます(user.nameにどのような名前を設定するかは、各人で自由に設定できます)。 そんな状況でも、まさに本人が作成したのかどうかを判別するために、署名を付けるという行為ができるようになっているようです。

この点について考察したブログがありましたので、リンクを掲載しておきます。


署名付きタグは、以下のように作成します。
$ git tag -s signed-tag-01 -m "my signed tag"
もし、以下ようなエラーが出てしまった場合には、gpgを作成する必要があります。
$ git tag -s signed-tag-01 -m "my signed tag"
error: cannot run gpg: No such file or directory
error: could not run gpg.
error: unable to sign the tag
MacOSにおける、gpgコマンドの導入や鍵の作成は、gpgでのファイルの暗号化基礎 - akihiro_obの日記で説明されているため、そちらをご参照ください。

自分はこの署名付きタグを使ったことないので、詳しい説明は割愛します。git showでタグの内容を確認すると、以下のように表示されるようです。
# 参照:Git-の基本-タグ | git-scm.com
$ git show v1.5
tag v1.5
Tagger: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Feb 9 15:22:20 2009 -0800

my signed 1.5 tag
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (Darwin)

iEYEABECAAYFAkmQurIACgkQON3DxfchxFr5cACeIMN+ZxLKggJQf0QYiQBwgySN
Ki0An2JeAVUCAiJ7Ox6ZEtK+NvZAj82/
=WryJ
-----END PGP SIGNATURE-----
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7... a6b4c97...
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sun Feb 8 19:02:46 2009 -0800

    Merge branch 'experiment'



タグをリモートに追加する

作成したタグを他の作業者と共有するには、リモートに追加する必要があります。 リモートへの追加は、以下のように行います。
# git push origin [tagname]
$ git push origin annotated-tag-01 
Counting objects: 1, done.
Writing objects: 100% (1/1), 178 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To https://github.com/yoheiMune2/sampleMune2
 * [new tag]         annotated-tag-01 -> annotated-tag-01
無事に、タグをリモートレポジトリにPUSHすることができました。 なお手元にあるタグを一気に上げたい場合には、以下のようにも出来るようです。
# タグを色々と追加してみる
$ git tag v0.1
$ git tag v1.2
$ git tag v1.4

# まとめてタグをPushする
$ git push origin --tags
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/yoheiMune2/sampleMune2
 * [new tag]         my-light-tag-01 -> my-light-tag-01
 * [new tag]         v0.1 -> v0.1
 * [new tag]         v1.2 -> v1.2
 * [new tag]         v1.4 -> v1.4



タグを削除する

続いてタグを削除する方法です。不要になった情報は削除して、さっぱりしたいものです。タグの削除は、以下のように行います。
# ローカルのタグを削除する
$ git tag -d v0.1
Deleted tag 'v0.1' (was 6e6cf84)
git branchなどと同じく、-dオプションで削除することが出来ます。
リモートにあるタグを削除するには、以下のように行います。
# git push origin :[tagname]
$ git push origin :v1.2
To https://github.com/yoheiMune2/sampleMune2
 - [deleted]         v1.2
ブランチの削除と同じように、:を付けてPushすれば削除することが出来ます。簡単ですね。



HEAD以外のコミットにタグを付ける

HEAD以外のコミットに遡ってタグを付けることが出来ます。タグを付ける際に、対象のコミットを指定します。
# ログを確認します
$ git log --online
6e6cf84 my first commit
3a1192f Initial commit

# 今回は3a1192fにタグを付けてみます
$ git tag -a tag-initial -m "tag for initial commit" 3a1192f
作成したタグの内容を確認してみましょう。
$ git show tag-initial 
tag tag-initial
Tagger: Yohei Munesada <y.munesada@gmail.com>
Date:   Sun Mar 16 23:38:28 2014 +0900

tag for initial commit

commit 3a1192fd3441476542c315b174cb87acf9667e3e
Author: Yohei Munesada <yfree.munesada@gmail.com>
Date:   Tue Jan 21 21:23:17 2014 -0800

    Initial commit

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..3479d90
--- /dev/null
+++ b/README.md
@@ -0,0 +1,4 @@
+sampleMune2
+===========
+
+This is a Sample repository. no good for you, maybe.
tag-initialタグが指すコミットが、3a1192fになっていることが分かります。



レポジトリを、タグの状態にする

タグの位置までレポジトリを巻き戻してみましょう。そのタグの状態をとりあえず確認できればよいのであれば、以下のように行います。
# git checkout [tagname]
$ git checkout tag-initial
Note: checking out 'tag-initial'.

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 -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 3a1192f... Initial commit
これで、tag-initialタグの状態になることが出来ました。ブランチを確認してみると、
$ git branch
* (detached from tag-initial)
  master
一時的なブランチにいることが分かります。とりあえず確認したいのではなく、ちゃんとブランチを作って、タグの状態にすることもできます。
# ブランチを作って、そのブランチをタグの状態にする
# git checkout -b [branchname] [tagname]
$ git checkout -b initial-tag-branch tag-initial
Switched to a new branch 'branch-initial'

# 作成したブランチを確認する
$ git branch
* branch-initial
  master
こんな感じで、作成したタグの状態でブランチを作成することができます。便利ですね!



参考資料

本記事を作成するために、以下を参照しました。ありがとうございます。
Git - タグ | git-scm.com



最後に

gitって3種類のタグがあるんですね。私も最近までよく分からずにタグを使っていました。 コミットに対して理解しやすい名前をつけられる機能って便利ですよね。あの動いていた時に戻したい、的な話とか良くありますw。

最後までご覧頂きましてありがとうございました。





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。