178
Git 仕組み 入門 2013 02 23 岡山 Git 勉強会

Git 仕組み 入門

Embed Size (px)

DESCRIPTION

岡山Git勉強会で Git の Object について話した。

Citation preview

Page 1: Git 仕組み 入門

Git 仕組み 入門

2013 02 23岡山 Git 勉強会

Page 2: Git 仕組み 入門

自己紹介

Twitter eielh

Githubeiel

火村 智彦EmacsHaskellRubyGentoo弐寺http://eiel.info/

Page 3: Git 仕組み 入門

目的

Page 4: Git 仕組み 入門

目的

Page 5: Git 仕組み 入門

目的

Page 6: Git 仕組み 入門

目的

• Git の仕組みを

Page 7: Git 仕組み 入門

目的

• Git の仕組みを• なんとなく理解する

Page 8: Git 仕組み 入門

目的

• Git の仕組みを• なんとなく理解する

• 特に

Page 9: Git 仕組み 入門

目的

• Git の仕組みを• なんとなく理解する

• 特に• Git の Object について

Page 10: Git 仕組み 入門

中身を知ると

Page 11: Git 仕組み 入門

中身を知ると

Page 12: Git 仕組み 入門

中身を知ると

• 応用力がつく

Page 13: Git 仕組み 入門

中身を知ると

• 応用力がつく• トラブルに強くなる

Page 14: Git 仕組み 入門

対象者

Page 15: Git 仕組み 入門

対象者

Page 16: Git 仕組み 入門

対象者

• 一応 Git を利用してる人

Page 17: Git 仕組み 入門

参考文献

Page 18: Git 仕組み 入門

参考文献

Page 19: Git 仕組み 入門

参考文献

• Pro git 9章

Page 20: Git 仕組み 入門

参考文献

• Pro git 9章• http://git-scm.com/book/ja/Git%E3%81%AE%E5%86%85%E5%81%B4

Page 21: Git 仕組み 入門

参考文献

• Pro git 9章• http://git-scm.com/book/ja/Git%E3%81%AE%E5%86%85%E5%81%B4

• man 7 gittutorial-2

Page 22: Git 仕組み 入門

参考文献

• Pro git 9章• http://git-scm.com/book/ja/Git%E3%81%AE%E5%86%85%E5%81%B4

• man 7 gittutorial-2• http://cdn8.atwikiimg.com/git_jp/pub/git-manual-jp/Documentation/gittutorial-2.html

Page 23: Git 仕組み 入門

アジェンダ

Page 24: Git 仕組み 入門

アジェンダ

Page 25: Git 仕組み 入門

アジェンダ

• そもそも Git ってなんだっけ

Page 26: Git 仕組み 入門

アジェンダ

• そもそも Git ってなんだっけ• Git Object

Page 27: Git 仕組み 入門

アジェンダ

• そもそも Git ってなんだっけ• Git Object• 考えてみよう - 他の機能とか

Page 28: Git 仕組み 入門

そもそも Git ってなんだっけ

Page 29: Git 仕組み 入門

バージョン管理システム

Page 30: Git 仕組み 入門

バージョン管理システム

Page 31: Git 仕組み 入門

バージョン管理システム

• 履歴が辿れる

Page 32: Git 仕組み 入門

バージョン管理システム

• 履歴が辿れる

• 変更内容を確認できる

Page 33: Git 仕組み 入門

バージョン管理システム

• 履歴が辿れる

• 変更内容を確認できる

• 以前の状態に戻れる

Page 34: Git 仕組み 入門

履歴が辿れる

• いつ、どうして変更したんだっけ

Page 35: Git 仕組み 入門

変更内容を確認できる

• どんな変更をしたんだっけ

Page 36: Git 仕組み 入門

以前の状態に戻れる

• やっぱり前のほうが…

Page 37: Git 仕組み 入門

Git はどのように実現したか

Page 38: Git 仕組み 入門

Git はどのように実現したか

Page 39: Git 仕組み 入門

Git はどのように実現したか

• 履歴にすべてを保存した

Page 40: Git 仕組み 入門

Git はどのように実現したか

• 履歴にすべてを保存した• ファイルの内容

Page 41: Git 仕組み 入門

Git はどのように実現したか

• 履歴にすべてを保存した• ファイルの内容

• ディレクトリの構造

Page 42: Git 仕組み 入門

Git はどのように実現したか

• 履歴にすべてを保存した• ファイルの内容

• ディレクトリの構造

• ファイルの一覧

Page 43: Git 仕組み 入門

Git はどのように実現したか

• 履歴にすべてを保存した• ファイルの内容

• ディレクトリの構造

• ファイルの一覧

• 履歴の情報

Page 44: Git 仕組み 入門

Git はどのように実現したか

• 履歴にすべてを保存した• ファイルの内容

• ディレクトリの構造

• ファイルの一覧

• 履歴の情報

Page 45: Git 仕組み 入門

Git はどのように実現したか

• 履歴にすべてを保存した• ファイルの内容

• ディレクトリの構造

• ファイルの一覧

• 履歴の情報

復元できる

Page 46: Git 仕組み 入門

履歴の情報

Page 47: Git 仕組み 入門

履歴の情報

Page 48: Git 仕組み 入門

履歴の情報

• 変更した人、時間

Page 49: Git 仕組み 入門

履歴の情報

• 変更した人、時間• ひとつ前の履歴

Page 50: Git 仕組み 入門

履歴の情報

• 変更した人、時間• ひとつ前の履歴• 変更した理由

Page 51: Git 仕組み 入門

履歴の情報

• 変更した人、時間• ひとつ前の履歴• 変更した理由

Page 52: Git 仕組み 入門

履歴の情報

• 変更した人、時間• ひとつ前の履歴• 変更した理由

履歴を辿れる

Page 53: Git 仕組み 入門

Git はどのように実現したか履歴

変更した理由 変更した人、時間 ディレクトリ 前の履歴

履歴 変更した理由 変更した人、時間 ディレクトリ 前の履歴

ディレクトリREADMElib

内容

ディレクトリhoge.rb 内容

ディレクトリREADMElib

Page 54: Git 仕組み 入門

まとめ

Page 55: Git 仕組み 入門

まとめ

Page 56: Git 仕組み 入門

まとめ

• Git はバージョン管理システム

Page 57: Git 仕組み 入門

まとめ

• Git はバージョン管理システム• バージョン管理システムを作るには

Page 58: Git 仕組み 入門

まとめ

• Git はバージョン管理システム• バージョン管理システムを作るには• ファイル

Page 59: Git 仕組み 入門

まとめ

• Git はバージョン管理システム• バージョン管理システムを作るには• ファイル

• ディレクトリ

Page 60: Git 仕組み 入門

まとめ

• Git はバージョン管理システム• バージョン管理システムを作るには• ファイル

• ディレクトリ

• 履歴

Page 61: Git 仕組み 入門

Git Object

Page 62: Git 仕組み 入門

Git Object

Page 63: Git 仕組み 入門

Git Object

Page 64: Git 仕組み 入門

Git Object

• Git のデータベース

Page 65: Git 仕組み 入門

Git Object の種類

Page 66: Git 仕組み 入門

Git Object の種類

Page 67: Git 仕組み 入門

Git Object の種類

• blob

Page 68: Git 仕組み 入門

Git Object の種類

• blob• tree

Page 69: Git 仕組み 入門

Git Object の種類

• blob• tree• commit

Page 70: Git 仕組み 入門

Git Object の種類

• blob• tree• commit• tag

Page 71: Git 仕組み 入門

Git Object の種類

• blob• tree• commit• tag• 今回は省略

Page 72: Git 仕組み 入門

blob

Page 73: Git 仕組み 入門

blob

Page 74: Git 仕組み 入門

blob

• ファイルの内容

Page 75: Git 仕組み 入門

blob

• ファイルの内容• それ以上でもそれ以下でもない

Page 76: Git 仕組み 入門

tree

Page 77: Git 仕組み 入門

tree

Page 78: Git 仕組み 入門

tree

• ディレクトリ構造

Page 79: Git 仕組み 入門

tree

• ディレクトリ構造• blob と treeの一覧

Page 80: Git 仕組み 入門

commit

Page 81: Git 仕組み 入門

commit

Page 82: Git 仕組み 入門

commit

• 履歴そのもの

Page 83: Git 仕組み 入門

commit

• 履歴そのもの• ひとつ前の commit を知ってる

Page 84: Git 仕組み 入門

commit

• 履歴そのもの• ひとつ前の commit を知ってる• 誰がいつ作ったものか知ってる

Page 85: Git 仕組み 入門

commit

• 履歴そのもの• ひとつ前の commit を知ってる• 誰がいつ作ったものか知ってる• ルートディレクトリを知ってる

Page 86: Git 仕組み 入門

Object のフォーマット

Page 87: Git 仕組み 入門

名前

Page 88: Git 仕組み 入門

名前

Page 89: Git 仕組み 入門

名前

• 中身を SHA-1 でハッシュ化したもの

Page 90: Git 仕組み 入門

中身

Page 91: Git 仕組み 入門

中身

Page 92: Git 仕組み 入門

中身

• ヘッダ

Page 93: Git 仕組み 入門

中身

• ヘッダ• オブジェクトの種類

Page 94: Git 仕組み 入門

中身

• ヘッダ• オブジェクトの種類

• ファイルサイズ

Page 95: Git 仕組み 入門

中身

• ヘッダ• オブジェクトの種類

• ファイルサイズ

• ボディ

Page 96: Git 仕組み 入門

中身

• ヘッダ• オブジェクトの種類

• ファイルサイズ

• ボディ• 内容

Page 97: Git 仕組み 入門

中身

• ヘッダ• オブジェクトの種類

• ファイルサイズ

• ボディ• 内容

• ヘッダとボディの区切り NUL

Page 98: Git 仕組み 入門

中身

• ヘッダとボディ が zlib で圧縮

Page 99: Git 仕組み 入門

オブジェクトの保存場所

Page 100: Git 仕組み 入門

オブジェクトの保存場所

Page 101: Git 仕組み 入門

オブジェクトの保存場所

• .git/objects

Page 102: Git 仕組み 入門

具体的に

Page 103: Git 仕組み 入門

サンプルリポジトリ

$ git clone [email protected]:eiel/git-object-sample.git$ cd git-object-sample

Page 104: Git 仕組み 入門

コマンドとか資料は以下に用意してます。https://github.com/eiel/okagit-object

Page 105: Git 仕組み 入門

ファイル構成

$ tree.├── README.md├── doc│ └── commands.org└── object.org

1 directory, 3 files

Page 106: Git 仕組み 入門

オブジェクトの保存場所

• .git/objects

Page 107: Git 仕組み 入門

.git/objects

$ tree .git/objects.git/objects/├── info└── pack ├── pack-68c839f0766ad945f74b6bc1785d7b952c07996b.idx └── pack-68c839f0766ad945f74b6bc1785d7b952c07996b.pack

2 directories, 2 files

Page 108: Git 仕組み 入門

pack はオブジェクトをまとめたもの

Page 109: Git 仕組み 入門

今回は無視します

Page 110: Git 仕組み 入門

.git/objects

$ tree .git/objects.git/objects/├── info└── pack ├── pack-68c839f0766ad945f74b6bc1785d7b952c07996b.idx └── pack-68c839f0766ad945f74b6bc1785d7b952c07996b.pack

2 directories, 2 files

Page 111: Git 仕組み 入門

とりあえずコミットしてみる

Page 112: Git 仕組み 入門

とりあえずコミットしてみる

$ echo "READMEを上書き" > README.md $ git commit -a -m 'READEMを上書きしました'$ cat README.mdREADMEを上書き

Page 113: Git 仕組み 入門

.git/objects

$ tree .git/objects/.git/objects/├── 04│ └── fb0db5f68f3e917ba90aacb09db78199bda6a7├── a0│ └── d74d48d61f95a874e30f8fb71bbd68506d0f6e├── fe│ └── ba9138249c3c6fcd9435fc38a6a29193abb76c├── info└── pack ├── pack-68c839f0766ad945f74b6bc1785d7b952c07996b.idx └── pack-68c839f0766ad945f74b6bc1785d7b952c07996b.pack

5 directories, 5 files

Page 114: Git 仕組み 入門

オブジェクトが3つできました

Page 115: Git 仕組み 入門

04fb0db5f68f3e917ba90aacb09db78199bda6a7 - commit 人によって違う

a0d74d48d61f95a874e30f8fb71bbd68506d0f6e - blob README

feba9138249c3c6fcd9435fc38a6a29193abb76c - tree

Page 116: Git 仕組み 入門

ファイルの中身を見てみよう

Page 117: Git 仕組み 入門

zlib ライブラリで圧縮されてるので…

Page 118: Git 仕組み 入門

ruby -rzlib -e 'puts Zlib.inflate(ARGF.read)'

Page 119: Git 仕組み 入門

展開して中身をみる

$ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e | \ ruby -rzlib -e 'puts Zlib.inflate(ARGF.read)'blob 19READMEを上書き

Page 120: Git 仕組み 入門

ただのテキストデータ

Page 121: Git 仕組み 入門

中身

• ヘッダ• オブジェクトの種類

• ファイルサイズ

• ボディ• 内容

• ヘッダとボディの区切り NUL

Page 122: Git 仕組み 入門

blob 19READMEを上書き

ヘッダ ボディ

Page 123: Git 仕組み 入門

中身

• ヘッダ• オブジェクトの種類

• ファイルサイズ

• ボディ• 内容

• ヘッダとボディの区切り NUL

Page 124: Git 仕組み 入門

blob 19READMEを上書き

種類 サイズ

Page 125: Git 仕組み 入門

中身

• ヘッダ• オブジェクトの種類

• ファイルサイズ

• ボディ• 内容

• ヘッダとボディの区切り NUL

Page 126: Git 仕組み 入門

区切りは NUL

$ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e | \ ruby -rzlib -e 'puts Zlib.inflate(ARGF.read)' | \ od -c0000000 b l o b 1 9 \0 R E A D M E 2020000020 222 ? 212 233 ? 201 215 \n0000033

Page 127: Git 仕組み 入門

区切りは NUL

$ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e | \ ruby -rzlib -e 'puts Zlib.inflate(ARGF.read)' | \ od -c0000000 b l o b 1 9 \0 R E A D M E 2020000020 222 ? 212 233 ? 201 215 \n0000033

Page 128: Git 仕組み 入門

名前

• 中身を SHA-1 でハッシュ化したもの

Page 129: Git 仕組み 入門

$ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e | \ ruby -rzlib -e 'puts Zlib.inflate(ARGF.read)' | \ sha1sum a0d74d48d61f95a874e30f8fb71bbd68506d0f6e

名前は 中身を SHA でハッシュしたもの

Page 130: Git 仕組み 入門

$ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e | \ ruby -rzlib -e 'puts Zlib.inflate(ARGF.read)' | \ sha1sum a0d74d48d61f95a874e30f8fb71bbd68506d0f6e

名前は 中身を SHA でハッシュしたもの

Page 131: Git 仕組み 入門

$ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e | \ ruby -rzlib -e 'puts Zlib.inflate(ARGF.read)' | \ sha1sum a0d74d48d61f95a874e30f8fb71bbd68506d0f6e

名前は 中身を SHA でハッシュしたもの

Page 132: Git 仕組み 入門

$ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e | \ ruby -rzlib -e 'puts Zlib.inflate(ARGF.read)' | \ sha1sum a0d74d48d61f95a874e30f8fb71bbd68506d0f6e

名前は 中身を SHA でハッシュしたもの

一致

Page 133: Git 仕組み 入門

他の中身を見る方法

$ git cat-file -t a0d74blob

$ git cat-file -s a0d7419

$ git cat-file -p a0d74READMEを上書き

$ git show a0d74READMEを上書き

Page 134: Git 仕組み 入門

他の中身を見る方法

$ git cat-file -t a0d74blob

$ git cat-file -s a0d7419

$ git cat-file -p a0d74READMEを上書き

$ git show a0d74READMEを上書き

種類

Page 135: Git 仕組み 入門

他の中身を見る方法

$ git cat-file -t a0d74blob

$ git cat-file -s a0d7419

$ git cat-file -p a0d74READMEを上書き

$ git show a0d74READMEを上書き

種類

サイズ

Page 136: Git 仕組み 入門

他の中身を見る方法

$ git cat-file -t a0d74blob

$ git cat-file -s a0d7419

$ git cat-file -p a0d74READMEを上書き

$ git show a0d74READMEを上書き

種類

サイズ

中身

Page 137: Git 仕組み 入門

他の中身を見る方法

$ git cat-file -t a0d74blob

$ git cat-file -s a0d7419

$ git cat-file -p a0d74READMEを上書き

$ git show a0d74READMEを上書き

種類

サイズ

中身

整形された情報

Page 138: Git 仕組み 入門

補足パックされてるオブジェクトの一覧

Page 139: Git 仕組み 入門

オブジェクトを全部見てみる

$ git rev-list --all --objects04fb0db5f68f3e917ba90aacb09db78199bda6a77dca985cea0d6e31591b46fe2610d5538dce466d26d033a78bb394bb0e86f8fb27a024f1df165300e4ffe1da5832106dd1a173db4854a1f18d54f0e8feba9138249c3c6fcd9435fc38a6a29193abb76c a0d74d48d61f95a874e30f8fb71bbd68506d0f6e README.md7ba05afba1830003b1c68c63f95f08440ee7a355 doc2784fbf7b28eeebf2676ff242e6490247e5477d6 doc/commands.orge2c1d9639a78a7eeb2432931f3fc78ffabf6aed9 object.org3b146a001783e7e5333f6da0560cf569c73da9b2 bbc83e8056103c2270c974e1abe2b79ac518cb6a README.md488d7f8b03c0874df7e9829cfa96a318fe4a4248

Page 140: Git 仕組み 入門

オブジェクトの詳細

Page 141: Git 仕組み 入門

commit

Page 142: Git 仕組み 入門

ふたつ前のcommit をみてみます

Page 143: Git 仕組み 入門

ふたつ前のcommit

$ git cat-file -p 7dca985cea0d6e31591b46fe2610d5538dce466dtree 3b146a001783e7e5333f6da0560cf569c73da9b2parent 26d033a78bb394bb0e86f8fb27a024f1df165300author Tomohiko Himura <[email protected]> 1361346494 +0900committer Tomohiko Himura <[email protected]> 1361347251 +0900

三番目のコミット

Page 144: Git 仕組み 入門

commit

• 履歴そのもの• ひとつ前の commit を知ってる• 誰がいつ作ったものか知ってる• ルートディレクトリを知ってる

Page 145: Git 仕組み 入門

ふたつ前のcommit

$ git cat-file -p 7dca985cea0d6e31591b46fe2610d5538dce466dtree 3b146a001783e7e5333f6da0560cf569c73da9b2parent 26d033a78bb394bb0e86f8fb27a024f1df165300author Tomohiko Himura <[email protected]> 1361346494 +0900committer Tomohiko Himura <[email protected]> 1361347251 +0900

三番目のコミット

Page 146: Git 仕組み 入門

commit

• 履歴そのもの• ひとつ前の commit を知ってる• 誰がいつ作ったものか知ってる• ルートディレクトリを知ってる

Page 147: Git 仕組み 入門

$ git cat-file -p 7dca985cea0d6e31591b46fe2610d5538dce466dtree 3b146a001783e7e5333f6da0560cf569c73da9b2parent 26d033a78bb394bb0e86f8fb27a024f1df165300author Tomohiko Himura <[email protected]> 1361346494 +0900committer Tomohiko Himura <[email protected]> 1361347251 +0900

三番目のコミット

ふたつ前のcommit

Page 148: Git 仕組み 入門

commit

• 履歴そのもの• ひとつ前の commit を知ってる• 誰がいつ作ったものか知ってる• ルートディレクトリを知ってる

Page 149: Git 仕組み 入門

$ git cat-file -p 7dca985cea0d6e31591b46fe2610d5538dce466dtree 3b146a001783e7e5333f6da0560cf569c73da9b2parent 26d033a78bb394bb0e86f8fb27a024f1df165300author Tomohiko Himura <[email protected]> 1361346494 +0900committer Tomohiko Himura <[email protected]> 1361347251 +0900

三番目のコミット

ふたつ前のcommit

Page 150: Git 仕組み 入門

tree

Page 151: Git 仕組み 入門

tree

$ git cat-file -p feba913100644 blob a0d74d48d61f95a874e30f8fb71bbd68506d0f6e README.md040000 tree 7ba05afba1830003b1c68c63f95f08440ee7a355 doc100644 blob e2c1d9639a78a7eeb2432931f3fc78ffabf6aed9 object.org

Page 152: Git 仕組み 入門

mode 種類 sha ファイル名

Page 153: Git 仕組み 入門

tree

$ git cat-file -p feba913100644 blob a0d74d48d61f95a874e30f8fb71bbd68506d0f6e README.md040000 tree 7ba05afba1830003b1c68c63f95f08440ee7a355 doc100644 blob e2c1d9639a78a7eeb2432931f3fc78ffabf6aed9 object.org

mode種類

shaファイル名

Page 154: Git 仕組み 入門

ファイル構成

$ tree.├── README.md├── doc│ └── commands.org└── object.org

1 directory, 3 files

Page 155: Git 仕組み 入門

tree

$ git cat-file -p feba913100644 blob a0d74d48d61f95a874e30f8fb71bbd68506d0f6e README.md040000 tree 7ba05afba1830003b1c68c63f95f08440ee7a355 doc100644 blob e2c1d9639a78a7eeb2432931f3fc78ffabf6aed9 object.org

Page 156: Git 仕組み 入門

ファイル構成

$ tree.├── README.md├── doc│ └── commands.org└── object.org

1 directory, 3 files

Page 157: Git 仕組み 入門

$ git cat-file -p feba913100644 blob a0d74d48d61f95a874e30f8fb71bbd68506d0f6e README.md040000 tree 7ba05afba1830003b1c68c63f95f08440ee7a355 doc100644 blob e2c1d9639a78a7eeb2432931f3fc78ffabf6aed9 object.org

tree

Page 158: Git 仕組み 入門

mode についてはman 2 statst_mode で検索

Page 159: Git 仕組み 入門

blob

Page 160: Git 仕組み 入門

blob は もう見たからいいや

Page 161: Git 仕組み 入門

まとめ

Page 162: Git 仕組み 入門

まとめ

Page 163: Git 仕組み 入門

まとめ

• Git は バージョン管理システム

Page 164: Git 仕組み 入門

まとめ

• Git は バージョン管理システム• バージョン管理システムを作るには

Page 165: Git 仕組み 入門

まとめ

• Git は バージョン管理システム• バージョン管理システムを作るには• ファイル - blob

Page 166: Git 仕組み 入門

まとめ

• Git は バージョン管理システム• バージョン管理システムを作るには• ファイル - blob

• ディレクトリ - tree

Page 167: Git 仕組み 入門

まとめ

• Git は バージョン管理システム• バージョン管理システムを作るには• ファイル - blob

• ディレクトリ - tree

• 履歴 - commit

Page 168: Git 仕組み 入門

考えてみよう

Page 169: Git 仕組み 入門

Git の 機能について実装方法を想像してみよう

Page 170: Git 仕組み 入門

答えはかかないけど

Page 171: Git 仕組み 入門

前の状態にもどす

Page 172: Git 仕組み 入門

差分をとる

Page 173: Git 仕組み 入門

ブランチ

Page 174: Git 仕組み 入門

git add しとけば復元できるかも

Page 175: Git 仕組み 入門

ファイルの移動の検知

Page 176: Git 仕組み 入門

git clone とか fetch

Page 177: Git 仕組み 入門

rebase したりコミットログをかきかえるとコミットの sha が変わる

Page 178: Git 仕組み 入門

ご清聴ありがとうございます