Went to Git Internals: Graphs, Hashed, and Compression at Yahoo! JAPAN #githubjp

I went to "Git Internals: Graphs, Hashed, and Compression" at Yahoo! JAPAN in Tokyo Midtown(Google Maps) on Friday, November 15, 2013. Thank you very much to @matthewmccull and @johndbritton for a meaningful and fun presentation!

昨日東京ミッドタウンのYahoo! JAPANさんで行われた「GitHub トレーニングチームから学ぶ Git の内部構造」に行ってきました! ※@matthewmccullさんと@johndbrittonさんに少しでも感謝の気持ちが伝わればいいな!という思いからところどころ英(単)語を交えつつ書いてみます。

会場は横に広くてscreenが3枚もあって、さらに全参加者分の机と電源を用意してくださっててWi-Fiも電波ゆんゆんでとても快適でした♪

内容はタイトル通り、GitHubというよりはGit自体の構造や考え方の紹介がほとんどで、「も、もっと宣伝とかしたほうが…!」と余計なお世話ながら心配してしまったほどです。 GitHub, Inc.のGit trainerである@matthewmccullさんがdemonstrationを交えつつのpresentationを行ってくださいました。 資料もdemoもとても楽しく、さらにsection毎に質問を受け付け、実際にterminalを操作しながら答えてくださるというなんとも手厚いsessionでした!

Impressions

主旨は「Gitは多くのbranchを作るためのツールなので、brachがどのようにfile systemにstoreされているか, どうやってbrachが作成されるのかを知ることで、小さなbranchをたくさん作り、短い間隔でdeployすることがどうして良いことなのかを理解しましょう」とのことだったと思います。ちょっと自信ないですけど。

GitHubが1日に何回もdeployを行っているのは有名な話ですが、数回どころではなく数百回行っておられるそうで、よく考えてみるとこれはとんでもないことですね!

そして「"programming"は(一部の)IT ManagerやCIOが勘違いしているように、ただ単にkeyboardをたたくことではなく、とても技術的なことなんだよ」との話とともにこのgif animationがscreenに映し出され、会場内の笑いを誘います。

f:id:mazgi:20141203073509g:plain

GitHubの方ってやっぱり実務家が多いんでしょうか、このSlideを思い出しました。

GitのHashについて「Centralized Revision Control System (Subversion, etc.)はsequentialなrevision number使うけど、GitはSHA-1 Hash使うよ」という説明のあと、"Gitのcommandsを使わずにcommit"するdemoがありました。 私も含めてほとんどの方が手元で試していたようで、demoというよりhands-onですね! そういえば今月まで同僚な@sue445が以前、社内勉強会で似たようなことしてたなーと思い出しつつ、screenを見ながら必死でterminalに向かっていました。 個人的に@sue445勉強会資料が分かりやすいので、あとで振り返りの参考にさせてもらおうと思っています。

そして手動commitのあとは「Gitは差分管理ではなくDirected Acyclic Graph採用してるんだよー」という説明に移ります。 commit, tree, blobの解説は実用Gitで読んだ記憶があるのですが、実際に説明を交えてdemoをしていただけると感覚として分かりやすいですね♪ https://twitter.com/yugui/status/244241024577327106 hashtagに乗って流れてきたこちらのtweetを読んで「なるほど」と思いました。脳内でオブジェクト操作に事前コンパイル…これからはやってみます!

git reflogの正体なんかも教えていただけて、Gitのsimpleさに改めて驚きました。 これは(最近翻訳をさぼっている)Fluentd Docsのworking copyですが、なるほど .git/logs/HEAD の内容から git reflog commandの出力結果を作れそうな気がしてきます。

[mazgi@Ardbeg] $ git reflog | head
7e65877 HEAD@{0}: merge eden/master: Fast-forward
d420bd4 HEAD@{1}: checkout: moving from spike/translate/ja/high-availability to master
84e9870 HEAD@{2}: checkout: moving from master to spike/translate/ja/high-availability
d420bd4 HEAD@{3}: merge eden/master: Fast-forward
814b275 HEAD@{4}: checkout: moving from feature/improve_outdated_task_for_i18n to master
f986707 HEAD@{5}: rebase -i (finish): returning to refs/heads/feature/improve_outdated_task_for_i18n
f986707 HEAD@{6}: rebase -i (squash): Improve outdated task to detect missing documents.
ee47b98 HEAD@{7}: checkout: moving from feature/improve_outdated_task_for_i18n to ee47b98
2971481 HEAD@{8}: rebase -i (finish): returning to refs/heads/feature/improve_outdated_task_for_i18n
2971481 HEAD@{9}: checkout: moving from feature/improve_outdated_task_for_i18n to 2971481ff43e593fb3f8cb71670a9f47974951e8
[mazgi@Ardbeg] $ tail -r -10 .git/logs/HEAD
d420bd4a90630e1e21bf54814778e56236092373 7e6587747c2541b7d97befcca9f30d4c22ff7616 MATSUKI.Hidenori <MATSUKI.Hidenori@gmail.com> 1384551369 +0900  merge eden/master: Fast-forward
84e98708d823b85bd0504d0afc37ae355b721257 d420bd4a90630e1e21bf54814778e56236092373 MATSUKI.Hidenori <MATSUKI.Hidenori@gmail.com> 1384551344 +0900  checkout: moving from spike/translate/ja/high-availability to master
d420bd4a90630e1e21bf54814778e56236092373 84e98708d823b85bd0504d0afc37ae355b721257 MATSUKI.Hidenori <MATSUKI.Hidenori@gmail.com> 1383166595 +0900  checkout: moving from master to spike/translate/ja/high-availability
814b27515376379d92325f461b4ab6555e7021b8 d420bd4a90630e1e21bf54814778e56236092373 MATSUKI.Hidenori <MATSUKI.Hidenori@gmail.com> 1383166526 +0900  merge eden/master: Fast-forward
f986707d4eb175bbd2e7043a17dc32b19f2f954a 814b27515376379d92325f461b4ab6555e7021b8 MATSUKI.Hidenori <MATSUKI.Hidenori@gmail.com> 1383166519 +0900  checkout: moving from feature/improve_outdated_task_for_i18n to master
f986707d4eb175bbd2e7043a17dc32b19f2f954a f986707d4eb175bbd2e7043a17dc32b19f2f954a MATSUKI.Hidenori <MATSUKI.Hidenori@gmail.com> 1381941389 +0900  rebase -i (finish): returning to refs/heads/feature/improve_outdated_task_for_i18n
ee47b9878d7e8619a22d70d3dc9cd7b293e0e0cd f986707d4eb175bbd2e7043a17dc32b19f2f954a MATSUKI.Hidenori <MATSUKI.Hidenori@gmail.com> 1381941373 +0900  rebase -i (squash): Improve outdated task to detect missing documents.
2971481ff43e593fb3f8cb71670a9f47974951e8 ee47b9878d7e8619a22d70d3dc9cd7b293e0e0cd MATSUKI.Hidenori <MATSUKI.Hidenori@gmail.com> 1381941373 +0900  checkout: moving from feature/improve_outdated_task_for_i18n to ee47b98
2971481ff43e593fb3f8cb71670a9f47974951e8 2971481ff43e593fb3f8cb71670a9f47974951e8 MATSUKI.Hidenori <MATSUKI.Hidenori@gmail.com> 1381941363 +0900  rebase -i (finish): returning to refs/heads/feature/improve_outdated_task_for_i18n
2971481ff43e593fb3f8cb71670a9f47974951e8 2971481ff43e593fb3f8cb71670a9f47974951e8 MATSUKI.Hidenori <MATSUKI.Hidenori@gmail.com> 1381941362 +0900  checkout: moving from feature/improve_outdated_task_for_i18n to 2971481ff43e593fb3f8cb71670a9f47974951e8

その他git fsckを初めてたたいたり、mergeのparentは理論上いくらでも(?)持てる話なんかを聞いて「へー」ボタンがあれば連打したかったです。 そして「GitHubでSHA-1 hashが衝突したことはないの?」という質問に@matthewmccullさんが、力強く「Yes!(衝突は1件も無い)」と即答されたときの「SHA1すげー!」という会場の雰囲気が心に残りました。 GitHubくらい多種多様なgit repositoryを大量に扱うと楽しそうですね♪

全体を通しての感想として、Gitを使う上での不安が薄れて安心感が増したというのがとても大きいです。

これまで社内frameworkのrelease managementをしていたので、releaseやbackportでヒヤヒヤしたり、version control上の問題を解消するために他のmemberにお願いしてベタで手間のかかる方法を取ったりしたこともあったのですが、これからはもっとaggressiveに効率が良くてみんなで幸せになれる方法を求めていけそうです♪

Q&A

私は2つ質問させていただきました。

Q:Gitは「記憶容量を犠牲にしても、分かりやすさ、速度を重視する」方針ということだけど、ストレージ容量は問題にならなくても書き込み速度やネットワークの帯域は問題になるのでは?それはトレードオフということなの?
A:
たしかにトレードオフはあるけど、統計を取るとほとんどの場合プラスに働いているよ!一番遅延がおこるところはnetworkだけど、相手側にないobjectを転送するときは圧縮するのでかなり効率が良いよ!
確かに圧縮されてますね。
[mazgi@Ardbeg] $ time git clone git@github.com:fluent/fluentd-docs.git
Cloning into 'fluentd-docs'...
remote: Counting objects: 2658, done.
remote: Compressing objects: 100% (1084/1084), done.
remote: Total 2658 (delta 1525), reused 2600 (delta 1472)
Receiving objects: 100% (2658/2658), 3.11 MiB | 746.00 KiB/s, done.
Resolving deltas: 100% (1525/1525), done.
Checking connectivity... done
git clone git@github.com:fluent/fluentd-docs.git  0.22s user 0.12s system 4% cpu 7.673 total
Q:hard-linkを使えないシステムでもgitは使えるの?
A:
hashを使ったGit独自のhard-linkのようなものを実装しているの使えるよ!Windows向けのgitではデフォルトでhard-linkを使わないようになってるよ!

Reports by attendees and Tweets

@orga_chemさんのblogが大変詳しくまとめてくださっていて分かりやすいです。 当日のtimelineをTogetterにまとめてみました。なぜかLinus氏の良い話で盛り上がっている雰囲気など伝わる…かもしれません。

お土産でGitHub StickersとGit cheat sheetをいただきました♪ 右側のドクロみたいなOctocatは質問するともらえる限定版(?)です。

最後に改めて@matthewmccullさんと@johndbrittonさん、素敵でとても分かりやすいpresentationと質問への丁寧な回答、本当にありがとうございました。 快適な会場と高速なWi-Fiと電源まで用意してくださったYahoo! JAPAN様、運営と通訳をしてくださった皆様、本当にありがとうございました。