SlideShare a Scribd company logo
やさしい
Gitの内部構造
YAPC::Asia2013
@DQNEO
@DQNEO
自己紹介
• PHPプログラマ
• CPAN Author (いちおう)
やさしいGitの内部構造 - yapcasia2013
オープンソース作品
https://github.com/DQNEO/S3ParallelUploader
https://github.com/DQNEO/ethnam
https://github.com/DQNEO/Amazon-S3-FastUploader
Java: S3ParallelUploader
Perl: Amazon::S3::FastUploader
PHP: Ethnam
ブログ
はじめに
※本プレゼンはわかりやすさを優先
したため、一部記述の厳密性を犠牲
にしております。
ご了承ください。m(__)m
本日のゴール
• コミットの中身を知る
• ブランチの正体を知る
• ポインタと連想配列
• オブジェクトグラフを理解する
きっかけ
Git使って
ますか?
• 毎日使ってる
• たまに使う
• 使ったことない
• 他のVCSがメイン
コミットとは
動詞:「コミットする」
名詞:「コミット」
二つの意味
「コミットする」
実際の挙動は
どうなってるの?
Q. “git commit”により作
成されるものは?
1. 差分
2. スナップショット
正解
1. 差分
2. スナップショット
間違えても
気にしないで!
「コミットする」
スナップショットを保存す
ること
=
スナップ
ショット
コミット
オブジェクト
db23d002c336f1ed408c2ef82b7ccb6a33c9f24cハッシュ値
名詞としての「コミット」
=スナップショット
へのポインタ
コミットオブジェクト
=
コミットハッシュ値が指し示すもの
=
Q. 1億行のファイルを
コミットしたときの
コミットオブジェクトの
サイズは?
1. でかい(1MB以上)
2. 小さい(1KB未満)
1億?
100,000,000
やさしいGitの内部構造 - yapcasia2013
やさしいGitの内部構造 - yapcasia2013
git checkout -
Q. 1億行のファイルを
コミットしたときの
コミットオブジェクトの
サイズは?
1. でかい(1MB以上)
2. 小さい(1KB未満)
1. でかい
2. 小さい
正解
コミット1
コミットオブジェクトのサイズは、
コンテンツのサイズによらずほぼ一定
コミット2
コミット
オブジェクト
スナップ
ショット
Gitを理解する鍵
「ポインタ」
※C言語のポインタとは関係ないよ
単に「参照」「指し示す」
くらいの意味
スナップ
ショット
コミット
オブジェクト
db23d002c336f1ed408c2ef82b7ccb6a33c9f24c
コミット
ハッシュ値
指し示す
指し示す
コミットオブジェクトの
中身を見てみよう
コミットオブジェクト
あああ
$ git cat-file -p 6e3c7a7
たったのこれだけ。
メタ情報しかない。
tree b2ba084f61385d9560daa1b43a98014c27620cee
parent 365d440b4c1ab31703ccbb7e2a9980d49cf8ebf6
parent 93f2ceeb0f0608f3754d379dcc473297ad1f0f43
author Tatsuhiko Miyagawa <miyagawa@xxxx.net>
committer Tatsuhiko Miyagawa <miyagawa@xxxx.net>
Merge pull request #430 from kazeburo/master
← コミットハッシュ値を指定
$ git cat-file -p 6e3c7a7
tree: スナップショットへのポインタ
← コミットオブジェクトの中身を表示
parent: 親コミットへのポインタ
コミットオブジェクト
tree b2ba084f61385d9560daa1b43a98014c27620cee
parent 365d440b4c1ab31703ccbb7e2a9980d49cf8ebf6
parent 93f2ceeb0f0608f3754d379dcc473297ad1f0f43
author Tatsuhiko Miyagawa <miyagawa@xxxx.net>
committer Tatsuhiko Miyagawa <miyagawa@xxxx.net>
Merge pull request #430 from kazeburo/master
親 子
A B
コミットオブジェクト
は、
親コミットへのポインタ
を持っている
親 子
A C
孫
B
ポインタを先祖へた
どっていくと
履歴がわかる
Q. 1億行のテキスト
ファイルに、1行追記し
てコミットすると、レポ
ジトリ容量はどのくらい
増える?
1. 1行分増える
2. 1億1行分増える
正解
1. 1行分増える
2. 1億1行分増える
コミット1
のスナップショット
レポジトリ内では、
別個のオブジェクトとして共存
コミット2
のスナップショット
1億行 1億1行
コミット1
のスナップショット
“git log –p”や”git show”で見れる差分
は、
あくまで計算による導出物であるコミット2
のスナップショット
差分
スナップショット
の構造
ルート
README.md
META.json
Tree Object
Blob Object (コンテンツ)
(Plackの例)
lib
scripts
HTTP Message PSGI.pm
plackup
ポインタの連鎖による階層構造
$ git ls-tree HEAD
100644 blob ba2434a0ebdb210e048f2e688652436569e4ffdc .gitignore
100644 blob e6bb679f9e41bc960f72b08b66c6ed46d4c90d4c .mailmap
100644 blob 5533888a0be3813e787cf17c60587fe313c6c23d .travis.yml
100644 blob 362d01e6f7b18e450f0a62187554e64c84f5cb10 Changes
100644 blob 0e07fb7a9173428f3b0f58035a781687bef06542 LICENSE
100644 blob 717d88241a49c58e4d811b555abdc9987a202e3c META.json
100644 blob 5d4062017fb9fe2631691b36a5167ad1d33bb79e Makefile.PL
100644 blob df73cecb9a6771392f8ffb4bbf46ad1057953338 README.md
040000 tree 17d81860c97909ce36c3a7bcd2ea2d89706e4cd1 benchmarks
100644 blob 9dca1adad84d3d4e57e297c2b4f57eaa0a54e3db cpanfile
100644 blob b1835cef488b7ad7cdee62882c4325851ce0404c dist.ini
040000 tree 16c9b6ece58b6028c10f0d983de5781c0cabb964 eg
040000 tree 206a4bef7128a678a020126744b058cbbea6bcac lib
040000 tree 359858f5219cd2e5f5171012e1b8f5f0da684301 script
040000 tree 38100c96e5798b5a513f95b36b85af38a377d5d9 share
040000 tree 8af8046f440af59731f8e93b48d62228ecfb8d83 t
040000 tree d2d27ab4124b7cf8194282c7493001543850bd0f xt
ツリーオブジェクトの中身
タグとは
タグのない世界
Plackの
8c461ae102afbcbbe279bffb171244b710650da1
の件なんだけどさー
えっ?
タグのない世界
だから、Plackのコミット
8c461ae102afbcbbe279bffb171244b710650da1
の話なんだけどさー
えっ?
それなんだっけ?
えっ?
馬鹿なの?
死ぬの?
タグのない世界
コミットハッシュ値と
か
覚えてないんだけど
タグのある世界
( ・ω・)
_ _ つ/ ̄ ̄ ̄/
\/___/ ̄
 ̄
Miyagawa氏
git tag 1.0000 8c461ae
Plackの”1.0000”
の件なんだけどさー
あー、はいはい
タグのある世界
git show 1.0000 git show 8c461ae=
等価
タグ 1.0000 コミット 8c461ae=
等価
タグとは
コミットオブジェクト
に付けられた
別名のこと
ブランチとは
枝じゃない!!
Gitに
枝という概念はな
い。
たぶんないはず。
ブランチも
コミットオブジェクトの
別名。
親
A
branchX
親 子
A B
branchX
コミットすると参照先が
勝手に移動
親 子
A C
孫
B
branchX
Like “だるまさんがころんだ”
ブランチの正体
$ cat .git/refs/heads/master
6e3c7a777a7231ff9bbce276e675b16f43287bef
コミットハッシュ値を格納した単なるファイル
コミットオブジェクトへのポインタ
ブランチは
コミットオブジェクトの
別名
git show master git show 8c461ae=
等価
git log master git log 8c461ae=
等価
アレで
たとえる
家康
将軍
家康 秀忠
将軍
家康 秀忠 家光
将軍
ブランチ ! = 徳川家
家康 秀忠 家光
将軍
タグ
東照大権現
ブランチ
• 差分ではなくスナップショット
• コミットオブジェクトは、スナッ
プショットへのポインタ
• タグはコミットオブジェクトへの
ポインタ
• ブランチもコミットへのポインタ
• Gitのデータ構造はポインタの連鎖
= オブジェクトグラフ
まとめ
内部構造を知っていれば色々捗る
つまり
やさしいGitの内部構造 - yapcasia2013
ご清聴
ありがとう
ございました
質問を
どうぞ!

More Related Content

PDF
ctfで学ぼうリバースエンジニアリング
PDF
ELFの動的リンク
PPTX
GitLab CI/CD パイプライン
PPTX
async/await のしくみ
PDF
いつやるの?Git入門
PDF
実践イカパケット解析
PDF
こわくない Git
PDF
できる!並列・並行プログラミング
ctfで学ぼうリバースエンジニアリング
ELFの動的リンク
GitLab CI/CD パイプライン
async/await のしくみ
いつやるの?Git入門
実践イカパケット解析
こわくない Git
できる!並列・並行プログラミング

What's hot (20)

PDF
Spring fest2020 spring-security
PDF
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
PDF
オブジェクト指向の設計と実装の学び方のコツ
PDF
いつやるの?Git入門 v1.1.0
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PDF
Spring Bootをはじめる時にやるべき10のこと
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
PDF
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
PDF
やりなおせる Git 入門
PDF
組み込みでこそC++を使う10の理由
PDF
コンセプトから理解するGitコマンド
PDF
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
PPTX
Effective Modern C++ 勉強会 Item 22
PDF
オブジェクト指向できていますか?
PPTX
高速なソートアルゴリズムを書こう!!
PPTX
C#や.NET Frameworkがやっていること
PDF
TOPPERSの開発も出来ちゃうVSCodeのビルド&デバッグ使いこなし術
PPTX
C#とILとネイティブと
PDF
テスト文字列に「うんこ」と入れるな
PPTX
PHP AST 徹底解説
Spring fest2020 spring-security
Redmineをちょっと便利に! プログラミング無しで使ってみるREST API
オブジェクト指向の設計と実装の学び方のコツ
いつやるの?Git入門 v1.1.0
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
Spring Bootをはじめる時にやるべき10のこと
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
劇的改善 Ci4時間から5分へ〜私がやった10のこと〜
やりなおせる Git 入門
組み込みでこそC++を使う10の理由
コンセプトから理解するGitコマンド
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
Effective Modern C++ 勉強会 Item 22
オブジェクト指向できていますか?
高速なソートアルゴリズムを書こう!!
C#や.NET Frameworkがやっていること
TOPPERSの開発も出来ちゃうVSCodeのビルド&デバッグ使いこなし術
C#とILとネイティブと
テスト文字列に「うんこ」と入れるな
PHP AST 徹底解説
Ad

Similar to やさしいGitの内部構造 - yapcasia2013 (20)

PDF
深層学習ライブラリのプログラミングモデル
PDF
Django で始める PyCharm 入門
PDF
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
PDF
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
PPTX
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
PDF
#phpmatsuri LT大会システムの中身
PPTX
私の好きなPython構文 vol.2 #nds46
PDF
PythonのGUI_2018 with NSEG
PDF
サードパーティパッケージの歩き方
PDF
Metahub for github
PPTX
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
PPTX
Multibranch Pipeline with Docker 入門編
PDF
Python & PyConJP 2014 Report
PPTX
Fluentd1.2 & Fluent Bit
PDF
今時のオンプレなgithubクローン環境構築
PDF
LT: 今日帰ってすぐに始められるPython #nds45
PPTX
211120 他人の書いたPythonスクリプトをステップ実行で理解する
PDF
PIAXで作る P2Pネットワーク
PDF
Kerasで深層学習を実践する
PDF
"Continuous Publication" with Python: Another Approach
深層学習ライブラリのプログラミングモデル
Django で始める PyCharm 入門
PhpStormを使おう --高槻からは快速急行が早くなります #jbugj
YAPC::Asia 2014 - 半端なPHPDisでPHPerに陰で笑われないためのPerl Monger向け最新PHP事情
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
#phpmatsuri LT大会システムの中身
私の好きなPython構文 vol.2 #nds46
PythonのGUI_2018 with NSEG
サードパーティパッケージの歩き方
Metahub for github
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
Multibranch Pipeline with Docker 入門編
Python & PyConJP 2014 Report
Fluentd1.2 & Fluent Bit
今時のオンプレなgithubクローン環境構築
LT: 今日帰ってすぐに始められるPython #nds45
211120 他人の書いたPythonスクリプトをステップ実行で理解する
PIAXで作る P2Pネットワーク
Kerasで深層学習を実践する
"Continuous Publication" with Python: Another Approach
Ad

More from DQNEO (9)

PDF
PHPの戻り値型宣言でselfを使ってみよう
PDF
Git tips by symbols
PPTX
Introduction to Guzzle
PDF
install PHP7 on CentOS7 by Ansible
PDF
Dependency Injection and Pimple
PDF
Gitのつくりかた YAPC::Asia 2015 @DQNEO
PPTX
plenv時代のImageMagick && Image::Magickインストール方法
PPTX
Gitの内部構造を 調べてみたら・・・
PPTX
桐島、ファイルに 保存するの やめるってよ
PHPの戻り値型宣言でselfを使ってみよう
Git tips by symbols
Introduction to Guzzle
install PHP7 on CentOS7 by Ansible
Dependency Injection and Pimple
Gitのつくりかた YAPC::Asia 2015 @DQNEO
plenv時代のImageMagick && Image::Magickインストール方法
Gitの内部構造を 調べてみたら・・・
桐島、ファイルに 保存するの やめるってよ

やさしいGitの内部構造 - yapcasia2013