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


自分で書いた記事[Gitオブジェクトにはどんなものがあるのか知りたい](http://qiita.com/shu920921/items/1b57d04dd34eb99828e5)の続編．

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

## Gitオブジェクトにはどんなものがある？
それは[Gitオブジェクトにはどんなものがあるのか知りたい](http://qiita.com/shu920921/items/1b57d04dd34eb99828e5)に少しまとめてありますので今回はもっとまともにチュートリアルしてみる．

## チュートリアル

### 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
```

##おわりに

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