Git 仕組み 入門2013 02 23岡山 Git 勉強会
自己紹介                                 Emacs                     Twitter     Haskell  火村 智彦                  eielh          ...
目的
目的
目的
目的• Git の仕組みを
目的• Git の仕組みを •   なんとなく理解する
目的• Git の仕組みを •   なんとなく理解する• 特に
目的• Git の仕組みを •   なんとなく理解する• 特に •   Git の Object について
中身を知ると
中身を知ると
中身を知ると• 応用力がつく
中身を知ると• 応用力がつく• トラブルに強くなる
対象者
対象者
対象者• 一応 Git を利用してる人
参考文献
参考文献
参考文献• Pro git 9章
参考文献• Pro git 9章 •   http://git-scm.com/book/ja/Git%E3%81%AE%E5%86%85%E5%81%B4
参考文献• Pro git 9章 •   http://git-scm.com/book/ja/Git%E3%81%AE%E5%86%85%E5%81%B4•    man 7 gittutorial-2
参考文献• 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.atw...
アジェンダ
アジェンダ
アジェンダ• そもそも Git ってなんだっけ
アジェンダ• そもそも Git ってなんだっけ• Git Object
アジェンダ• そもそも Git ってなんだっけ• Git Object• 考えてみよう - 他の機能とか
そもそも Git ってなんだっけ
バージョン管理システム
バージョン管理システム
バージョン管理システム•   履歴が辿れる
バージョン管理システム•   履歴が辿れる•   変更内容を確認できる
バージョン管理システム•   履歴が辿れる•   変更内容を確認できる•   以前の状態に戻れる
履歴が辿れる• いつ、どうして変更したんだっけ
変更内容を確認できる• どんな変更をしたんだっけ
以前の状態に戻れる• やっぱり前のほうが…
Git はどのように実現したか
Git はどのように実現したか
Git はどのように実現したか• 履歴にすべてを保存した
Git はどのように実現したか• 履歴にすべてを保存した •   ファイルの内容
Git はどのように実現したか• 履歴にすべてを保存した •   ファイルの内容 •   ディレクトリの構造
Git はどのように実現したか• 履歴にすべてを保存した • ファイルの内容 • ディレクトリの構造  • ファイルの一覧
Git はどのように実現したか• 履歴にすべてを保存した • ファイルの内容 • ディレクトリの構造  • ファイルの一覧 • 履歴の情報
Git はどのように実現したか• 履歴にすべてを保存した • ファイルの内容 • ディレクトリの構造  • ファイルの一覧 • 履歴の情報
Git はどのように実現したか• 履歴にすべてを保存した     復元できる • ファイルの内容 • ディレクトリの構造  • ファイルの一覧 • 履歴の情報
履歴の情報
履歴の情報
履歴の情報• 変更した人、時間
履歴の情報• 変更した人、時間• ひとつ前の履歴
履歴の情報• 変更した人、時間• ひとつ前の履歴• 変更した理由
履歴の情報• 変更した人、時間• ひとつ前の履歴• 変更した理由
履歴の情報• 変更した人、時間   履歴を辿れる• ひとつ前の履歴• 変更した理由
Git はどのように実現したか   履歴                    内容変更した理由       ディレクトリ変更した人、時間   READMEディレクトリ     lib前の履歴                ディレクトリ   履...
まとめ
まとめ
まとめ• Git はバージョン管理システム
まとめ• Git はバージョン管理システム• バージョン管理システムを作るには
まとめ• Git はバージョン管理システム• バージョン管理システムを作るには •   ファイル
まとめ• Git はバージョン管理システム• バージョン管理システムを作るには •   ファイル •   ディレクトリ
まとめ• Git はバージョン管理システム• バージョン管理システムを作るには •   ファイル •   ディレクトリ •   履歴
Git Object
Git Object
Git Object
Git Object• Git のデータベース
Git Object の種類
Git Object の種類
Git Object の種類• blob
Git Object の種類• blob• tree
Git Object の種類• blob• tree• commit
Git Object の種類• blob• tree• commit• tag
Git Object の種類• blob• tree• commit• tag •   今回は省略
blob
blob
blob• ファイルの内容
blob• ファイルの内容• それ以上でもそれ以下でもない
tree
tree
tree• ディレクトリ構造
tree• ディレクトリ構造• blob と treeの一覧
commit
commit
commit• 履歴そのもの
commit• 履歴そのもの• ひとつ前の commit を知ってる
commit• 履歴そのもの• ひとつ前の commit を知ってる• 誰がいつ作ったものか知ってる
commit• 履歴そのもの• ひとつ前の commit を知ってる• 誰がいつ作ったものか知ってる• ルートディレクトリを知ってる
Object のフォーマット
名前
名前
名前• 中身を SHA-1 でハッシュ化したもの
中身
中身
中身• ヘッダ
中身• ヘッダ •   オブジェクトの種類
中身• ヘッダ •   オブジェクトの種類 •   ファイルサイズ
中身• ヘッダ •   オブジェクトの種類 •   ファイルサイズ• ボディ
中身• ヘッダ •   オブジェクトの種類 •   ファイルサイズ• ボディ •   内容
中身• ヘッダ •   オブジェクトの種類 •   ファイルサイズ• ボディ •   内容• ヘッダとボディの区切り NUL
中身• ヘッダとボディ が zlib で圧縮
オブジェクトの保存場所
オブジェクトの保存場所
オブジェクトの保存場所• .git/objects
具体的に
サンプルリポジトリ$ git clone git@github.com:eiel/git-object-sample.git$ cd git-object-sample
コマンドとか資料は以下に用意してます。https://github.com/eiel/okagit-object
ファイル構成$ tree.├── README.md├── doc│   └── commands.org└── object.org1 directory, 3 files
オブジェクトの保存場所• .git/objects
.git/objects$ tree .git/objects.git/objects/├── info└── pack    ├── pack-68c839f0766ad945f74b6bc1785d7b952c07996b.idx    └...
pack はオブジェクトをまとめたもの
今回は無視します
.git/objects$ tree .git/objects.git/objects/├── info└── pack  ├── pack-68c839f0766ad945f74b6bc1785d7b952c07996b.idx  └── p...
とりあえずコミットしてみる
とりあえずコミットしてみる$ echo "READMEを上書き" > README.md$ git commit -a -m READEMを上書きしました$ cat README.mdREADMEを上書き
.git/objects  $ tree .git/objects/.git/objects/├── 04│   └── fb0db5f68f3e917ba90aacb09db78199bda6a7├── a0│   └── d74d48d61...
オブジェクトが3つできました
04fb0db5f68f3e917ba90aacb09db78199bda6a7 - commit      人によって違うa0d74d48d61f95a874e30f8fb71bbd68506d0f6e - blob        READM...
ファイルの中身を見てみよう
zlib ライブラリで圧縮されてるので…
ruby -rzlib -e puts Zlib.inflate(ARGF.read)
展開して中身をみる$ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e |           ruby -rzlib -e puts Zlib.inflate(ARGF.re...
ただのテキストデータ
中身• ヘッダ •   オブジェクトの種類 •   ファイルサイズ• ボディ •   内容• ヘッダとボディの区切り NUL
ヘッダ       ボディblob 19READMEを上書き
中身• ヘッダ •   オブジェクトの種類 •   ファイルサイズ• ボディ •   内容• ヘッダとボディの区切り NUL
種類 サイズblob 19READMEを上書き
中身• ヘッダ •   オブジェクトの種類 •   ファイルサイズ• ボディ •   内容• ヘッダとボディの区切り NUL
区切りは NUL  $ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e |             ruby -rzlib -e puts Zlib.inflate(ARGF...
区切りは NUL  $ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e |             ruby -rzlib -e puts Zlib.inflate(ARGF...
名前• 中身を SHA-1 でハッシュ化したもの
名前は 中身を SHA でハッシュしたもの$ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e |     ruby -rzlib -e puts Zlib.inflate(A...
名前は 中身を SHA でハッシュしたもの$ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e |     ruby -rzlib -e puts Zlib.inflate(A...
名前は 中身を SHA でハッシュしたもの$ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e |     ruby -rzlib -e puts Zlib.inflate(A...
名前は 中身を SHA でハッシュしたもの                                               一致$ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68...
他の中身を見る方法$ git cat-file -t a0d74blob$ git cat-file -s a0d7419$ git cat-file -p a0d74READMEを上書き$ git show a0d74READMEを上書き
他の中身を見る方法$ git cat-file -t a0d74   種類blob$ git cat-file -s a0d7419$ git cat-file -p a0d74READMEを上書き$ git show a0d74READMEを...
他の中身を見る方法$ git cat-file -t a0d74   種類blob$ git cat-file -s a0d74   サイズ19$ git cat-file -p a0d74READMEを上書き$ git show a0d74R...
他の中身を見る方法$ git cat-file -t a0d74   種類blob$ git cat-file -s a0d74   サイズ19$ git cat-file -p a0d74READMEを上書き                 ...
他の中身を見る方法$ git cat-file -t a0d74     種類blob$ git cat-file -s a0d74     サイズ19$ git cat-file -p a0d74READMEを上書き             ...
補足パックされてるオブジェクトの一覧
オブジェクトを全部見てみる$ git rev-list --all --objects04fb0db5f68f3e917ba90aacb09db78199bda6a77dca985cea0d6e31591b46fe2610d5538dce466...
オブジェクトの詳細
commit
ふたつ前のcommit をみてみます
ふたつ前のcommit$ git cat-file -p 7dca985cea0d6e31591b46fe2610d5538dce466dtree 3b146a001783e7e5333f6da0560cf569c73da9b2parent 2...
commit• 履歴そのもの• ひとつ前の commit を知ってる• 誰がいつ作ったものか知ってる• ルートディレクトリを知ってる
ふたつ前のcommit$ git cat-file -p 7dca985cea0d6e31591b46fe2610d5538dce466dtree 3b146a001783e7e5333f6da0560cf569c73da9b2parent 2...
commit• 履歴そのもの• ひとつ前の commit を知ってる• 誰がいつ作ったものか知ってる• ルートディレクトリを知ってる
ふたつ前のcommit$ git cat-file -p 7dca985cea0d6e31591b46fe2610d5538dce466dtree 3b146a001783e7e5333f6da0560cf569c73da9b2parent 2...
commit• 履歴そのもの• ひとつ前の commit を知ってる• 誰がいつ作ったものか知ってる• ルートディレクトリを知ってる
ふたつ前のcommit$ git cat-file -p 7dca985cea0d6e31591b46fe2610d5538dce466dtree 3b146a001783e7e5333f6da0560cf569c73da9b2parent 2...
tree
tree$ git cat-file -p feba913100644 blob a0d74d48d61f95a874e30f8fb71bbd68506d0f6e   README.md040000 tree 7ba05afba1830003b...
mode 種類 sha ファイル名
tree$ git cat-file -p feba913100644 blob a0d74d48d61f95a874e30f8fb71bbd68506d0f6e    README.md040000 tree 7ba05afba1830003...
ファイル構成$ tree.├── README.md├── doc│   └── commands.org└── object.org1 directory, 3 files
tree$ git cat-file -p feba913100644 blob a0d74d48d61f95a874e30f8fb71bbd68506d0f6e   README.md040000 tree 7ba05afba1830003b...
ファイル構成$ tree.├── README.md├── doc│   └── commands.org└── object.org1 directory, 3 files
tree$ git cat-file -p feba913100644 blob a0d74d48d61f95a874e30f8fb71bbd68506d0f6e   README.md040000 tree 7ba05afba1830003b...
mode については  man 2 statst_mode で検索
blob
blob は もう見たからいいや
まとめ
まとめ
まとめ• Git は バージョン管理システム
まとめ• Git は バージョン管理システム• バージョン管理システムを作るには
まとめ• Git は バージョン管理システム• バージョン管理システムを作るには •   ファイル   - blob
まとめ• Git は バージョン管理システム• バージョン管理システムを作るには •   ファイル    - blob •   ディレクトリ - tree
まとめ• Git は バージョン管理システム• バージョン管理システムを作るには •   ファイル    - blob •   ディレクトリ - tree •   履歴      - commit
考えてみよう
Git の 機能について    実装方法を  想像してみよう
答えはかかないけど
前の状態にもどす
差分をとる
ブランチ
git add しとけば復元できるかも
ファイルの移動の検知
git clone とか fetch
rebase したりコミットログをかきかえると コミットの sha が変わる
ご清聴ありがとうございます
Upcoming SlideShare
Loading in …5
×

Git 仕組み 入門

2,599 views

Published on

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

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,599
On SlideShare
0
From Embeds
0
Number of Embeds
752
Actions
Shares
0
Downloads
14
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Git 仕組み 入門

  1. 1. Git 仕組み 入門2013 02 23岡山 Git 勉強会
  2. 2. 自己紹介 Emacs Twitter Haskell 火村 智彦 eielh Ruby Github Gentoo eiel http://eiel.info/ 弐寺
  3. 3. 目的
  4. 4. 目的
  5. 5. 目的
  6. 6. 目的• Git の仕組みを
  7. 7. 目的• Git の仕組みを • なんとなく理解する
  8. 8. 目的• Git の仕組みを • なんとなく理解する• 特に
  9. 9. 目的• Git の仕組みを • なんとなく理解する• 特に • Git の Object について
  10. 10. 中身を知ると
  11. 11. 中身を知ると
  12. 12. 中身を知ると• 応用力がつく
  13. 13. 中身を知ると• 応用力がつく• トラブルに強くなる
  14. 14. 対象者
  15. 15. 対象者
  16. 16. 対象者• 一応 Git を利用してる人
  17. 17. 参考文献
  18. 18. 参考文献
  19. 19. 参考文献• Pro git 9章
  20. 20. 参考文献• Pro git 9章 • http://git-scm.com/book/ja/Git%E3%81%AE%E5%86%85%E5%81%B4
  21. 21. 参考文献• Pro git 9章 • http://git-scm.com/book/ja/Git%E3%81%AE%E5%86%85%E5%81%B4• man 7 gittutorial-2
  22. 22. 参考文献• 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
  23. 23. アジェンダ
  24. 24. アジェンダ
  25. 25. アジェンダ• そもそも Git ってなんだっけ
  26. 26. アジェンダ• そもそも Git ってなんだっけ• Git Object
  27. 27. アジェンダ• そもそも Git ってなんだっけ• Git Object• 考えてみよう - 他の機能とか
  28. 28. そもそも Git ってなんだっけ
  29. 29. バージョン管理システム
  30. 30. バージョン管理システム
  31. 31. バージョン管理システム• 履歴が辿れる
  32. 32. バージョン管理システム• 履歴が辿れる• 変更内容を確認できる
  33. 33. バージョン管理システム• 履歴が辿れる• 変更内容を確認できる• 以前の状態に戻れる
  34. 34. 履歴が辿れる• いつ、どうして変更したんだっけ
  35. 35. 変更内容を確認できる• どんな変更をしたんだっけ
  36. 36. 以前の状態に戻れる• やっぱり前のほうが…
  37. 37. Git はどのように実現したか
  38. 38. Git はどのように実現したか
  39. 39. Git はどのように実現したか• 履歴にすべてを保存した
  40. 40. Git はどのように実現したか• 履歴にすべてを保存した • ファイルの内容
  41. 41. Git はどのように実現したか• 履歴にすべてを保存した • ファイルの内容 • ディレクトリの構造
  42. 42. Git はどのように実現したか• 履歴にすべてを保存した • ファイルの内容 • ディレクトリの構造 • ファイルの一覧
  43. 43. Git はどのように実現したか• 履歴にすべてを保存した • ファイルの内容 • ディレクトリの構造 • ファイルの一覧 • 履歴の情報
  44. 44. Git はどのように実現したか• 履歴にすべてを保存した • ファイルの内容 • ディレクトリの構造 • ファイルの一覧 • 履歴の情報
  45. 45. Git はどのように実現したか• 履歴にすべてを保存した 復元できる • ファイルの内容 • ディレクトリの構造 • ファイルの一覧 • 履歴の情報
  46. 46. 履歴の情報
  47. 47. 履歴の情報
  48. 48. 履歴の情報• 変更した人、時間
  49. 49. 履歴の情報• 変更した人、時間• ひとつ前の履歴
  50. 50. 履歴の情報• 変更した人、時間• ひとつ前の履歴• 変更した理由
  51. 51. 履歴の情報• 変更した人、時間• ひとつ前の履歴• 変更した理由
  52. 52. 履歴の情報• 変更した人、時間 履歴を辿れる• ひとつ前の履歴• 変更した理由
  53. 53. Git はどのように実現したか 履歴 内容変更した理由 ディレクトリ変更した人、時間 READMEディレクトリ lib前の履歴 ディレクトリ 履歴 hoge.rb 内容変更した理由変更した人、時間ディレクトリ前の履歴 ディレクトリ README
  54. 54. まとめ
  55. 55. まとめ
  56. 56. まとめ• Git はバージョン管理システム
  57. 57. まとめ• Git はバージョン管理システム• バージョン管理システムを作るには
  58. 58. まとめ• Git はバージョン管理システム• バージョン管理システムを作るには • ファイル
  59. 59. まとめ• Git はバージョン管理システム• バージョン管理システムを作るには • ファイル • ディレクトリ
  60. 60. まとめ• Git はバージョン管理システム• バージョン管理システムを作るには • ファイル • ディレクトリ • 履歴
  61. 61. Git Object
  62. 62. Git Object
  63. 63. Git Object
  64. 64. Git Object• Git のデータベース
  65. 65. Git Object の種類
  66. 66. Git Object の種類
  67. 67. Git Object の種類• blob
  68. 68. Git Object の種類• blob• tree
  69. 69. Git Object の種類• blob• tree• commit
  70. 70. Git Object の種類• blob• tree• commit• tag
  71. 71. Git Object の種類• blob• tree• commit• tag • 今回は省略
  72. 72. blob
  73. 73. blob
  74. 74. blob• ファイルの内容
  75. 75. blob• ファイルの内容• それ以上でもそれ以下でもない
  76. 76. tree
  77. 77. tree
  78. 78. tree• ディレクトリ構造
  79. 79. tree• ディレクトリ構造• blob と treeの一覧
  80. 80. commit
  81. 81. commit
  82. 82. commit• 履歴そのもの
  83. 83. commit• 履歴そのもの• ひとつ前の commit を知ってる
  84. 84. commit• 履歴そのもの• ひとつ前の commit を知ってる• 誰がいつ作ったものか知ってる
  85. 85. commit• 履歴そのもの• ひとつ前の commit を知ってる• 誰がいつ作ったものか知ってる• ルートディレクトリを知ってる
  86. 86. Object のフォーマット
  87. 87. 名前
  88. 88. 名前
  89. 89. 名前• 中身を SHA-1 でハッシュ化したもの
  90. 90. 中身
  91. 91. 中身
  92. 92. 中身• ヘッダ
  93. 93. 中身• ヘッダ • オブジェクトの種類
  94. 94. 中身• ヘッダ • オブジェクトの種類 • ファイルサイズ
  95. 95. 中身• ヘッダ • オブジェクトの種類 • ファイルサイズ• ボディ
  96. 96. 中身• ヘッダ • オブジェクトの種類 • ファイルサイズ• ボディ • 内容
  97. 97. 中身• ヘッダ • オブジェクトの種類 • ファイルサイズ• ボディ • 内容• ヘッダとボディの区切り NUL
  98. 98. 中身• ヘッダとボディ が zlib で圧縮
  99. 99. オブジェクトの保存場所
  100. 100. オブジェクトの保存場所
  101. 101. オブジェクトの保存場所• .git/objects
  102. 102. 具体的に
  103. 103. サンプルリポジトリ$ git clone git@github.com:eiel/git-object-sample.git$ cd git-object-sample
  104. 104. コマンドとか資料は以下に用意してます。https://github.com/eiel/okagit-object
  105. 105. ファイル構成$ tree.├── README.md├── doc│ └── commands.org└── object.org1 directory, 3 files
  106. 106. オブジェクトの保存場所• .git/objects
  107. 107. .git/objects$ tree .git/objects.git/objects/├── info└── pack ├── pack-68c839f0766ad945f74b6bc1785d7b952c07996b.idx └── pack-68c839f0766ad945f74b6bc1785d7b952c07996b.pack2 directories, 2 files
  108. 108. pack はオブジェクトをまとめたもの
  109. 109. 今回は無視します
  110. 110. .git/objects$ tree .git/objects.git/objects/├── info└── pack ├── pack-68c839f0766ad945f74b6bc1785d7b952c07996b.idx └── pack-68c839f0766ad945f74b6bc1785d7b952c07996b.pack2 directories, 2 files
  111. 111. とりあえずコミットしてみる
  112. 112. とりあえずコミットしてみる$ echo "READMEを上書き" > README.md$ git commit -a -m READEMを上書きしました$ cat README.mdREADMEを上書き
  113. 113. .git/objects $ tree .git/objects/.git/objects/├── 04│ └── fb0db5f68f3e917ba90aacb09db78199bda6a7├── a0│ └── d74d48d61f95a874e30f8fb71bbd68506d0f6e├── fe│ └── ba9138249c3c6fcd9435fc38a6a29193abb76c├── info└── pack ├── pack-68c839f0766ad945f74b6bc1785d7b952c07996b.idx └── pack-68c839f0766ad945f74b6bc1785d7b952c07996b.pack5 directories, 5 files
  114. 114. オブジェクトが3つできました
  115. 115. 04fb0db5f68f3e917ba90aacb09db78199bda6a7 - commit 人によって違うa0d74d48d61f95a874e30f8fb71bbd68506d0f6e - blob READMEfeba9138249c3c6fcd9435fc38a6a29193abb76c - tree
  116. 116. ファイルの中身を見てみよう
  117. 117. zlib ライブラリで圧縮されてるので…
  118. 118. ruby -rzlib -e puts Zlib.inflate(ARGF.read)
  119. 119. 展開して中身をみる$ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e | ruby -rzlib -e puts Zlib.inflate(ARGF.read)blob 19READMEを上書き
  120. 120. ただのテキストデータ
  121. 121. 中身• ヘッダ • オブジェクトの種類 • ファイルサイズ• ボディ • 内容• ヘッダとボディの区切り NUL
  122. 122. ヘッダ ボディblob 19READMEを上書き
  123. 123. 中身• ヘッダ • オブジェクトの種類 • ファイルサイズ• ボディ • 内容• ヘッダとボディの区切り NUL
  124. 124. 種類 サイズblob 19READMEを上書き
  125. 125. 中身• ヘッダ • オブジェクトの種類 • ファイルサイズ• ボディ • 内容• ヘッダとボディの区切り NUL
  126. 126. 区切りは 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
  127. 127. 区切りは 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
  128. 128. 名前• 中身を SHA-1 でハッシュ化したもの
  129. 129. 名前は 中身を SHA でハッシュしたもの$ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e | ruby -rzlib -e puts Zlib.inflate(ARGF.read) | sha1sum a0d74d48d61f95a874e30f8fb71bbd68506d0f6e
  130. 130. 名前は 中身を SHA でハッシュしたもの$ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e | ruby -rzlib -e puts Zlib.inflate(ARGF.read) | sha1sum a0d74d48d61f95a874e30f8fb71bbd68506d0f6e
  131. 131. 名前は 中身を SHA でハッシュしたもの$ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e | ruby -rzlib -e puts Zlib.inflate(ARGF.read) | sha1sum a0d74d48d61f95a874e30f8fb71bbd68506d0f6e
  132. 132. 名前は 中身を SHA でハッシュしたもの 一致$ cat .git/objects/a0/d74d48d61f95a874e30f8fb71bbd68506d0f6e | ruby -rzlib -e puts Zlib.inflate(ARGF.read) | sha1sum a0d74d48d61f95a874e30f8fb71bbd68506d0f6e
  133. 133. 他の中身を見る方法$ git cat-file -t a0d74blob$ git cat-file -s a0d7419$ git cat-file -p a0d74READMEを上書き$ git show a0d74READMEを上書き
  134. 134. 他の中身を見る方法$ git cat-file -t a0d74 種類blob$ git cat-file -s a0d7419$ git cat-file -p a0d74READMEを上書き$ git show a0d74READMEを上書き
  135. 135. 他の中身を見る方法$ git cat-file -t a0d74 種類blob$ git cat-file -s a0d74 サイズ19$ git cat-file -p a0d74READMEを上書き$ git show a0d74READMEを上書き
  136. 136. 他の中身を見る方法$ git cat-file -t a0d74 種類blob$ git cat-file -s a0d74 サイズ19$ git cat-file -p a0d74READMEを上書き 中身$ git show a0d74READMEを上書き
  137. 137. 他の中身を見る方法$ git cat-file -t a0d74 種類blob$ git cat-file -s a0d74 サイズ19$ git cat-file -p a0d74READMEを上書き 中身$ git show a0d74READMEを上書き 整形された情報
  138. 138. 補足パックされてるオブジェクトの一覧
  139. 139. オブジェクトを全部見てみる$ git rev-list --all --objects04fb0db5f68f3e917ba90aacb09db78199bda6a77dca985cea0d6e31591b46fe2610d5538dce466d26d033a78bb394bb0e86f8fb27a024f1df165300e4ffe1da5832106dd1a173db4854a1f18d54f0e8feba9138249c3c6fcd9435fc38a6a29193abb76ca0d74d48d61f95a874e30f8fb71bbd68506d0f6e README.md7ba05afba1830003b1c68c63f95f08440ee7a355 doc2784fbf7b28eeebf2676ff242e6490247e5477d6 doc/commands.orge2c1d9639a78a7eeb2432931f3fc78ffabf6aed9 object.org3b146a001783e7e5333f6da0560cf569c73da9b2bbc83e8056103c2270c974e1abe2b79ac518cb6a README.md488d7f8b03c0874df7e9829cfa96a318fe4a4248
  140. 140. オブジェクトの詳細
  141. 141. commit
  142. 142. ふたつ前のcommit をみてみます
  143. 143. ふたつ前のcommit$ git cat-file -p 7dca985cea0d6e31591b46fe2610d5538dce466dtree 3b146a001783e7e5333f6da0560cf569c73da9b2parent 26d033a78bb394bb0e86f8fb27a024f1df165300author Tomohiko Himura <eiel.hal@gmail.com> 1361346494 +0900committer Tomohiko Himura <eiel.hal@gmail.com> 1361347251 +0900三番目のコミット
  144. 144. commit• 履歴そのもの• ひとつ前の commit を知ってる• 誰がいつ作ったものか知ってる• ルートディレクトリを知ってる
  145. 145. ふたつ前のcommit$ git cat-file -p 7dca985cea0d6e31591b46fe2610d5538dce466dtree 3b146a001783e7e5333f6da0560cf569c73da9b2parent 26d033a78bb394bb0e86f8fb27a024f1df165300author Tomohiko Himura <eiel.hal@gmail.com> 1361346494 +0900committer Tomohiko Himura <eiel.hal@gmail.com> 1361347251 +0900三番目のコミット
  146. 146. commit• 履歴そのもの• ひとつ前の commit を知ってる• 誰がいつ作ったものか知ってる• ルートディレクトリを知ってる
  147. 147. ふたつ前のcommit$ git cat-file -p 7dca985cea0d6e31591b46fe2610d5538dce466dtree 3b146a001783e7e5333f6da0560cf569c73da9b2parent 26d033a78bb394bb0e86f8fb27a024f1df165300author Tomohiko Himura <eiel.hal@gmail.com> 1361346494 +0900committer Tomohiko Himura <eiel.hal@gmail.com> 1361347251 +0900三番目のコミット
  148. 148. commit• 履歴そのもの• ひとつ前の commit を知ってる• 誰がいつ作ったものか知ってる• ルートディレクトリを知ってる
  149. 149. ふたつ前のcommit$ git cat-file -p 7dca985cea0d6e31591b46fe2610d5538dce466dtree 3b146a001783e7e5333f6da0560cf569c73da9b2parent 26d033a78bb394bb0e86f8fb27a024f1df165300author Tomohiko Himura <eiel.hal@gmail.com> 1361346494 +0900committer Tomohiko Himura <eiel.hal@gmail.com> 1361347251 +0900三番目のコミット
  150. 150. tree
  151. 151. tree$ git cat-file -p feba913100644 blob a0d74d48d61f95a874e30f8fb71bbd68506d0f6e README.md040000 tree 7ba05afba1830003b1c68c63f95f08440ee7a355 doc100644 blob e2c1d9639a78a7eeb2432931f3fc78ffabf6aed9 object.org
  152. 152. mode 種類 sha ファイル名
  153. 153. tree$ git cat-file -p feba913100644 blob a0d74d48d61f95a874e30f8fb71bbd68506d0f6e README.md040000 tree 7ba05afba1830003b1c68c63f95f08440ee7a355 doc100644 blob e2c1d9639a78a7eeb2432931f3fc78ffabf6aed9 object.orgmode sha 種類 ファイル名
  154. 154. ファイル構成$ tree.├── README.md├── doc│ └── commands.org└── object.org1 directory, 3 files
  155. 155. tree$ git cat-file -p feba913100644 blob a0d74d48d61f95a874e30f8fb71bbd68506d0f6e README.md040000 tree 7ba05afba1830003b1c68c63f95f08440ee7a355 doc100644 blob e2c1d9639a78a7eeb2432931f3fc78ffabf6aed9 object.org
  156. 156. ファイル構成$ tree.├── README.md├── doc│ └── commands.org└── object.org1 directory, 3 files
  157. 157. tree$ git cat-file -p feba913100644 blob a0d74d48d61f95a874e30f8fb71bbd68506d0f6e README.md040000 tree 7ba05afba1830003b1c68c63f95f08440ee7a355 doc100644 blob e2c1d9639a78a7eeb2432931f3fc78ffabf6aed9 object.org
  158. 158. mode については man 2 statst_mode で検索
  159. 159. blob
  160. 160. blob は もう見たからいいや
  161. 161. まとめ
  162. 162. まとめ
  163. 163. まとめ• Git は バージョン管理システム
  164. 164. まとめ• Git は バージョン管理システム• バージョン管理システムを作るには
  165. 165. まとめ• Git は バージョン管理システム• バージョン管理システムを作るには • ファイル - blob
  166. 166. まとめ• Git は バージョン管理システム• バージョン管理システムを作るには • ファイル - blob • ディレクトリ - tree
  167. 167. まとめ• Git は バージョン管理システム• バージョン管理システムを作るには • ファイル - blob • ディレクトリ - tree • 履歴 - commit
  168. 168. 考えてみよう
  169. 169. Git の 機能について 実装方法を 想像してみよう
  170. 170. 答えはかかないけど
  171. 171. 前の状態にもどす
  172. 172. 差分をとる
  173. 173. ブランチ
  174. 174. git add しとけば復元できるかも
  175. 175. ファイルの移動の検知
  176. 176. git clone とか fetch
  177. 177. rebase したりコミットログをかきかえると コミットの sha が変わる
  178. 178. ご清聴ありがとうございます

×