自分で書いた記事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
おわりに
まあ数学の授業も証明なんてものがあるんだし,今回もそういう位置づけの記事ってことでいいのかな..