Gitコマンド入門::Gitオブジェクト(update-ref,TAG)第五十七回

5 min read読了の目安(約4500字

みなさんこんにちは! 今回もGit本家のサイトを参考にして進めていきますよ!
前回は、軽量 (lightweight) 版のタグを作成したので、今回は、注釈付きタグ(annotated) 版です! 環境は前回のそのまま流用して進めていきます。

前回、第五十六回の記事はこちらから!

https://zenn.dev/shiozumi/articles/53c02817b72faa

git本家本元の情報はこちらから!

https://git-scm.com/book/ja/v2

今日の課題も前回同様、ここを参考にしています!

https://git-scm.com/book/ja/v2/Gitの内側-Gitの参照

10.3 Gitの内側 - Gitの参照

Gitの参照の下の方で、タグ、Tagの解説箇所です!

注釈付きタグ (annotated) 版!

$ git log --oneline
1e3f489 (HEAD -> test, origin/master, master) third commit
514ff38 second commit
8cab88d first commit <!-- ここに注釈付きタグ、v3.0

$ git tag -a v3.0 8cab88d -m 'test tag'

$ git log --oneline
1e3f489 (HEAD -> test, origin/master, master) third commit
514ff38 (tag: v2.0_short, tag: v2.0, tag: v1.0) second commit
8cab88d (tag: v3.0) first commit // <!-- ここに追加されました!

$ git tag
v1.0
v2.0
v2.0_short
v3.0
// v3.0が、追加されていますね!

注釈付きタグの中身を確認!

$ cat .git/refs/tags/v3.0
c6684e1aa89d75c53a6f6aacf3b56c4316510070
// ハッシュ値ですが、8cab88d first commit とは異なります

// では、その中身をのぞいて見ると・・・
$ cat-file -p c6684e1aa89d75c53a6f6aacf3b56c4316510070
object 8cab88d049aa2c32533dd2c7aef02470d493d0ce
type commit
tag v3.0
tagger Makoto Shiozumi <shiozumi@esmile-hd.com> 1616242247 +0900

test tag
  1. object 8cab88d~ // コミットのハッシュ値!
  2. type commit // 属性は、commit値!
  3. tag v3.0 // tagの名前
  4. tagger Makoto Shiozumi // 作成した人の情報
  5. test tag // 最後にコメントですね!

軽量 (lightweight) 版のタグの場合は、ファイルの中身は、コミットのハッシュ値のみでしたね。注釈付きタグ (annotated) 版は、コミットのハッシュ値ではなく、オブジェクトのハッシュ値となり、その中身は上記のように、さらに、5つの情報が格納されています。

さらに、Gitのドキュメントを読んでいくと・・・

Git本家本元のサイトからのドキュメントを抜粋!
objectの項目が、上でタグ付けしたコミットのSHA-1ハッシュ値を指していることに注意してください。また、この項目が必ずしもコミットだけをポイントするものではないことも覚えておいてください。あらゆるGitオブジェクトに対してタグを付けることができます。

あらゆるGitオブジェクトに対してタグを付けることができます。

ということは、コミット以外の、ブランチ、ファイル、ツリーなど、とにかくハッシュ値しているものに対しては、恐らくすべてのコミット値に対して、タグ名を付けられるってことですね。おっ! これは便利ですね~ というか、ハッシュ値を検索するのも大変だし、絶対に覚えられない(大爆笑) そもそも、このハッシュ値を複数見ていると、、、それだけで混乱してくる、数字の魔力も感じます。(^▽^;)

new.txt にタグ付けしてみます!

$ ls -a
.  ..  .git  bak  new.txt  test.txt
// 前回から利用しているリポジトリーには、new.txt ファイルがあります!

$ cat new.txt
new file
// ファイルの中身を確認!

$ git hash-object -w new.txt
fa49b077972391ad58037050f2a75f74e3671e92
// まずは、このオブジェクトのハッシュ値を求めて!
// 先頭の2文字がディレクトリー名となり、残り38文字がファイル名
// 以下のように、ファイルを確認できますね!

$ ls .git/objects/fa/49b077972391ad58037050f2a75f74e3671e92
.git/objects/fa/49b077972391ad58037050f2a75f74e3671e92
// これで、ファイルの存在確認できました!

$ git cat-file -p fa49b077972391ad58037050f2a75f74e3671e92
new file
// これで、再度、確認完了!

$ git tag -a new_txt fa49b077972391ad58037050f2a75f74e3671e92 -m 'new.txt tag'
// ハッシュ値、fa49b07~を指定して、タグ付けを実行します!

$ git tag
new_txt // <!-- 追加されていますね!
v1.0
v2.0
v2.0_short
v3.0

$ cat .git/refs/tags/new_txt
62ccb70b02c30a14a952a80064e2bf6bb1350a4f
// ファイルの中身は、ハッシュ値!

$ git rev-parse new_txt
62ccb70b02c30a14a952a80064e2bf6bb1350a4f
// タグ名からも、ハッシュ値を取得可能ですね!

$ git cat-file -p 62ccb70b02c30a14a952a80064e2bf6bb1350a4f
object fa49b077972391ad58037050f2a75f74e3671e92
type blob
tag new_txt
tagger Makoto Shiozumi <shiozumi@esmile-hd.com> 1616244834 +0900

new.txt tag

// object fa49b07~のハッシュ値で、さらに、cat-file!
$ git cat-file -p fa49b077972391ad58037050f2a75f74e3671e92
new file
// これで、確認完了!

git cat-file -p 62ccb70 ~中略

  1. object fa49b077 ~ // git hash-object -w new.txt と同じハッシュ値!
  2. type blob // オブジェクトの属性は、勿論、blob ですね。
  3. tag new_txt // タグ名
  4. tagger Makoto Shiozumi ~ // タグ作成者情報
  5. new.txt tag // コメント分!

git rev-parse new_txt

説明もしないで、何気なく使っていましたが、実は、初コマンドでしたね。

$ git rev-parse HEAD
1e3f4892a273326780b4fb8b44a5b76469b5ffa2
// HEADのハッシュ値!

$ cat .git/refs/heads/master
1e3f4892a273326780b4fb8b44a5b76469b5ffa2
// rev-parse でも、cat コマンドでも、同じハッシュ値を取得!

$ git rev-parse test
1e3f4892a273326780b4fb8b44a5b76469b5ffa2
// ローカルtestブランチのハッシュ値!

$ cat .git/refs/heads/test
1e3f4892a273326780b4fb8b44a5b76469b5ffa2
// rev-parse でも、cat コマンドでも、同じハッシュ値を取得!

$ git cat-file -p new_txt
object fa49b077972391ad58037050f2a75f74e3671e92
type blob
tag new_txt
tagger Makoto Shiozumi <shiozumi@esmile-hd.com> 1616246267 +0900

new.txt tag
// ハッシュ値、62ccb70 ~中略 ではなく、new_txt のタグ名指定でもOK!

たくさんやってみると、それはそれで混乱してくるのですが、なにはともあれ、タグは、ハッシュ値を持つオブジェクトには、全て付けられますね! みなさんも、思うが儘、思いつくが儘に、お試しください!

まとめ!

当たり前だけど、タグオブジェクトの中身は、object ハッシュ値ですから、ハッシュ値を持つ全てのオブジェクトには、タグを付けられます! ハッシュ値だけを頼りにして、比較していると、、、正直、頭が混乱してくるうぅぅ~~~ というか、ハッシュ値だけを記憶するのは、ほぼ、困難なので、タグ機能は無くてはならない存在でした。いわば、URLを保存しておく、ブラウザーのブックマークのようなものですね!

それでは、今回はここまで、お疲れ様でした!

https://zenn.dev/shiozumi/articles/2c79628bbbb042
https://twitter.com/esmile2013