LoginSignup
3
3

More than 5 years have passed since last update.

コマンドを叩きながらcommitオブジェクトについて探ってみた

Last updated at Posted at 2015-12-17

自分で書いた記事Gitオブジェクトにはどんなものがあるのか知りたいの続編.

長くなってしまったのでオチを先に言うと,git logコマンドの証明みたいになっちゃいました.

Gitオブジェクトにはどんなものがある?

それはGitオブジェクトにはどんなものがあるのか知りたいに少しまとめてありますので今回はもっとまともにチュートリアルしてみる.

チュートリアル

Gitプロジェクト作成

$ mkdir APItest
$ cd APItest
$ git init

とりあえずAPItestという名のGitプロジェクトを作った.
GitHubにリポジトリをつくっておき,最新にしておく.

$ git remote add origin https://github.com/shu920921/APItest.git
$ git pull origin master

これで前準備終わり.

追加してみる

名前に意味はないけど,とりあえずjapanっていうディレクトリつくる.
その中に適当に都道府県を入れていく.

$ echo tokyo > tokyo.txt
$ echo akita > akita.txt
$ echo okinawa > okinawa.txt

$ ls
akita.txt   okinawa.txt tokyo.txt

まあ今はこんな感じ.
全部コミットする.

$ git add.
$ git commit -m "add akita, tokyo & okinawa.txt"
[master 182c0b9] add akita, tokyo & okinawa.txt
 3 files changed, 3 insertions(+)
 create mode 100644 japan/akita.txt
 create mode 100644 japan/okinawa.txt
 create mode 100644 japan/tokyo.txt

どうやら182c0b9っていうオブジェクトができたっぽいのでプロジェクト配下の.git/objectsを見てみましょう

$ ls
0b   18   27   33   48   8a   aa   d0   ef   info pack

んでcommitオブジェクトは182c0b9なので18の中を見ると..

$ ls 18
2c0b91544b3d7dbd3c49d6d8056ee018bcfed8

おお,これですね

コミットの中身を確認.

念のため,このハッシュ値がどういったオブジェクトなのか確認してみる

$ git cat-file -t 182c0b9
commit

あってます.

んじゃ中身を見てみると..

$ git cat-file -p 182c0b9
tree 8ac48bce80c91e2c2cbe2e520cce689bd853e386
parent 0b035b0521eeb7d236f9982ab850cd281d87a3b7
author shu- <address> 1450379785 +0900
committer shu- <address> 1450379785 +0900

add akita, tokyo & okinawa.txt

ふむふむ

git logで確認できるcommit logとはまた少し違う出力ですね.

ぐぐればでてくるんだろうけどそれじゃつまらないっしょってことでコマンドを使って調べていきます!

tree

これはtreeオブジェクトってことでいいのかな..
こういう時はgit cat-file -tで確認できるはず!

$ git cat-file -t 8ac48bce80c9
tree

確認できました.
それで中身は...

$ git cat-file -p 8ac48bce80c9
100644 blob d092d7d44eabde3878550da2b81a4fd1854e87fd    README.md
040000 tree aa2e79350b03a15bdb2f880d1b9aa7ac2bf551bb    japan

どうやら今の話題のtreeっていうのはプロジェクト配下からなんですかねー

またtreeがでてきましたが後は一緒なので割愛します.

parent

さっきと同様どんなオブジェクトか調べてみる.

$ git cat-file -t 0b035b05
commit

ってことは文字通りさっきのcommit(182c0b9)の前のcommitってことかな

$ git log
commit 182c0b91544b3d7dbd3c49d6d8056ee018bcfed8
Author: shu- <address>
Date:   Fri Dec 18 04:16:25 2015 +0900

    add akita, tokyo & okinawa.txt

commit 0b035b0521eeb7d236f9982ab850cd281d87a3b7
Author: shu- <address>
Date:   Fri Dec 18 04:09:57 2015 +0900

    Initial commit

そのようですね!

author committer

今は自分ひとりでしか作業してないのでここらへんはまた今度
そしてその下の文はいわずもがなcommitコメントですよね

改版してみる.

改版1回目

東京に住んでるので

$ echo 'I live' >> tokyo.txt 

んでaddしてからcommitっと

$ git commit -m "add description"
[master 3d44df2] add description
 1 file changed, 1 insertion(+)

さっきと同様このcommitの中身を確認

$ git cat-file -p 3d44df2
tree a71fe9eeb6d821616805f452cf2496d9f2cdf3fc
parent 182c0b91544b3d7dbd3c49d6d8056ee018bcfed8
author shu- <address> 1450381759 +0900
committer shu- <address> 1450381759 +0900

add description

parentが前のコミットになってますねー
treeの中身を確認すると...

$ git cat-file -p a71fe
100644 blob d092d7d44eabde3878550da2b81a4fd1854e87fd    README.md
040000 tree af6de619a1907edecb1f09ec3fd601617f932ea7    japan

じゃあ,今はtokyo.txtだけ改版しましたが,akita.txtも改版してみます!
ここで注目すべきは,parentと,japanディレクトリのハッシュ値ですかね

改版2回目

やってみました(略記)

$ git commit -m "add description to akita.txt"
[master a4d8be3] add description to akita.txt
 1 file changed, 1 insertion(+)

$ git cat-file -p a4d8be3
tree abd96f951643450205e0fe3740af4f0e0fb7dd70
parent 3d44df2c032d2350e15a99cc311cfd1b9d8c4db6

$ git cat-file -p abd96
100644 blob d092d7d44eabde3878550da2b81a4fd1854e87fd    README.md
040000 tree 3e085b8c6dcd93202591fb8d932f47ec6aeac645    japan

さっきのtokyo.txtを編集したときのcommitオブジェクトがparentになりましたね
てっきり一番はじめのcommitオブジェクト182c0b9がでてくるのでは?と思ってたけども..
一回目の改版と冒頭を比べてもわかってはいたけども,ちゃんとjapanディレクトリのハッシュ値がかわりました.

改版されなかったファイルはどうなってる?

okinawa.txtは一体どうなってるんでしょうか.
当然何も変わってないとは思うけど一応ね一応.
結果だけ記載

# 1回目の改版時
$ git cat-file -p af6de619
100644 blob 487bfa4bcdbbe33cba922ab2b0b68b392fef2132    akita.txt
100644 blob 3382c3a1d6e8dcd3b1c0ba6da08347ce238c2a5c    okinawa.txt
100644 blob e8518c9337a7e8d1ea36457b23d1fdbe818e2c8f    tokyo.txt

# 2回目の改版時
$ git cat-file -p 3e085b
100644 blob 44300b162d39d36a1a60ad42f2f91f7117c3bf42    akita.txt
100644 blob 3382c3a1d6e8dcd3b1c0ba6da08347ce238c2a5c    okinawa.txt
100644 blob e8518c9337a7e8d1ea36457b23d1fdbe818e2c8f    tokyo.txt

秋田以外は変わっていませんね.めでたしめでたし.

わかったこと!

全部 git logで知れる情報と一緒ってことwww

$ git log
###akita.txtに変更した後のコミット
commit a4d8be301343000f0d681ff7099ee6e3e7d8da7e
Author: shu- <address>
Date:   Fri Dec 18 04:54:53 2015 +0900

    add description to akita.txt

###tokyo.txtを変更した後のコミット
commit 3d44df2c032d2350e15a99cc311cfd1b9d8c4db6
Author: shu- <address>
Date:   Fri Dec 18 04:49:19 2015 +0900

    add description

###ディレクトリ作ってファイル足したあとのコミット
commit 182c0b91544b3d7dbd3c49d6d8056ee018bcfed8
Author: shu- <address>
Date:   Fri Dec 18 04:16:25 2015 +0900

    add akita, tokyo & okinawa.txt

##GitHubでREADMEを作った時のcommit
commit 0b035b0521eeb7d236f9982ab850cd281d87a3b7
Author: shu- <address>
Date:   Fri Dec 18 04:09:57 2015 +0900

    Initial commit

## 特定のファイル見たいなら
$ git log -p akita.txt
commit a4d8be301343000f0d681ff7099ee6e3e7d8da7e
Author: shu- <m153304w@st.u-gakugei.ac.jp>
Date:   Fri Dec 18 04:54:53 2015 +0900

    add description to akita.txt

diff --git a/japan/akita.txt b/japan/akita.txt
index 487bfa4..44300b1 100644
--- a/japan/akita.txt
+++ b/japan/akita.txt
@@ -1 +1,2 @@
 akita
+I lived..

commit 182c0b91544b3d7dbd3c49d6d8056ee018bcfed8
Author: shu- <m153304w@st.u-gakugei.ac.jp>
Date:   Fri Dec 18 04:16:25 2015 +0900

    add akita, tokyo & okinawa.txt

diff --git a/japan/akita.txt b/japan/akita.txt
new file mode 100644
index 0000000..487bfa4

おわりに

まあ数学の授業も証明なんてものがあるんだし,今回もそういう位置づけの記事ってことでいいのかな..

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3