Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

of

実践 Git - 低レベルに知る Git Slide 1 実践 Git - 低レベルに知る Git Slide 2 実践 Git - 低レベルに知る Git Slide 3 実践 Git - 低レベルに知る Git Slide 4 実践 Git - 低レベルに知る Git Slide 5 実践 Git - 低レベルに知る Git Slide 6 実践 Git - 低レベルに知る Git Slide 7 実践 Git - 低レベルに知る Git Slide 8 実践 Git - 低レベルに知る Git Slide 9 実践 Git - 低レベルに知る Git Slide 10 実践 Git - 低レベルに知る Git Slide 11 実践 Git - 低レベルに知る Git Slide 12 実践 Git - 低レベルに知る Git Slide 13 実践 Git - 低レベルに知る Git Slide 14 実践 Git - 低レベルに知る Git Slide 15 実践 Git - 低レベルに知る Git Slide 16 実践 Git - 低レベルに知る Git Slide 17 実践 Git - 低レベルに知る Git Slide 18 実践 Git - 低レベルに知る Git Slide 19 実践 Git - 低レベルに知る Git Slide 20 実践 Git - 低レベルに知る Git Slide 21 実践 Git - 低レベルに知る Git Slide 22 実践 Git - 低レベルに知る Git Slide 23 実践 Git - 低レベルに知る Git Slide 24 実践 Git - 低レベルに知る Git Slide 25 実践 Git - 低レベルに知る Git Slide 26 実践 Git - 低レベルに知る Git Slide 27 実践 Git - 低レベルに知る Git Slide 28 実践 Git - 低レベルに知る Git Slide 29 実践 Git - 低レベルに知る Git Slide 30 実践 Git - 低レベルに知る Git Slide 31 実践 Git - 低レベルに知る Git Slide 32 実践 Git - 低レベルに知る Git Slide 33 実践 Git - 低レベルに知る Git Slide 34 実践 Git - 低レベルに知る Git Slide 35 実践 Git - 低レベルに知る Git Slide 36 実践 Git - 低レベルに知る Git Slide 37 実践 Git - 低レベルに知る Git Slide 38 実践 Git - 低レベルに知る Git Slide 39 実践 Git - 低レベルに知る Git Slide 40 実践 Git - 低レベルに知る Git Slide 41 実践 Git - 低レベルに知る Git Slide 42 実践 Git - 低レベルに知る Git Slide 43 実践 Git - 低レベルに知る Git Slide 44 実践 Git - 低レベルに知る Git Slide 45 実践 Git - 低レベルに知る Git Slide 46 実践 Git - 低レベルに知る Git Slide 47 実践 Git - 低レベルに知る Git Slide 48 実践 Git - 低レベルに知る Git Slide 49 実践 Git - 低レベルに知る Git Slide 50 実践 Git - 低レベルに知る Git Slide 51 実践 Git - 低レベルに知る Git Slide 52 実践 Git - 低レベルに知る Git Slide 53 実践 Git - 低レベルに知る Git Slide 54 実践 Git - 低レベルに知る Git Slide 55 実践 Git - 低レベルに知る Git Slide 56 実践 Git - 低レベルに知る Git Slide 57 実践 Git - 低レベルに知る Git Slide 58 実践 Git - 低レベルに知る Git Slide 59 実践 Git - 低レベルに知る Git Slide 60 実践 Git - 低レベルに知る Git Slide 61 実践 Git - 低レベルに知る Git Slide 62 実践 Git - 低レベルに知る Git Slide 63 実践 Git - 低レベルに知る Git Slide 64 実践 Git - 低レベルに知る Git Slide 65 実践 Git - 低レベルに知る Git Slide 66 実践 Git - 低レベルに知る Git Slide 67 実践 Git - 低レベルに知る Git Slide 68 実践 Git - 低レベルに知る Git Slide 69
Upcoming SlideShare
いつやるの?Git入門
Next

87 Likes

Share

実践 Git - 低レベルに知る Git

gumistudy@福岡 vol.2 http://atnd.org/events/27933
original slide: http://youhei.github.io/showoff-git-lowlevel

Related Books

Free with a 30 day trial from Scribd

See all

実践 Git - 低レベルに知る Git

  1. 1. 実践 Git 低レベルに知る Git
  2. 2. 本⽇のアジェンダ ⾃⼰紹介 スライドのスコープについて リポジトリ オブジェクトデータベース インデックス リファレンス まとめ
  3. 3. <⾃⼰紹介>
  4. 4. 新⽥ 洋平 2012年3⽉ 福岡オフィス⼊社 アプリケーションエンジニア 福岡に来て昨⽇でまだ⼆ヶ⽉ 仲良くしてね
  5. 5. ソーシャルメディアとか blog @youhei fb.com/youhei git.io/youhei
  6. 6. Git 使⽤歴 前職までは Subversion 中⼼ 前職の2つのプロジェクトで実験的に導⼊ 初⼼者2名でそれほどノウハウも溜まらず ちゃんと使い出したのは gumi に⼊ってから
  7. 7. </⾃⼰紹介>
  8. 8. みなさん Git 使ってますか?
  9. 9. Git ってなんかわかりにくく ないですか?
  10. 10. ⾃分はわかりにくいなあと 感じていました
  11. 11. はてブ, Twitter に溢れる 初⼼者向け Tips
  12. 12. 各地で開催される Git 勉強会
  13. 13. Git のわかりにくさを解消す るための様々なツール
  14. 14. GUI
  15. 15. sourcetreeapp.com
  16. 16. git-tower.com
  17. 17. CLI
  18. 18. git-flow $ git flow init $ git flow feature start branch_name $ git flow feature end branch_name $ git flow hotfix $ git flow release
  19. 19. legit - Git Workflow for Humans $ git switch <branch> $ git sync $ git publish $ git unpublish $ git harvest $ git sprout $ git graft $ git branches
  20. 20. 便利ツールは諸刃の剣 これら⾼機能なツールは Git を使いやすくしてくれますが、「本質 的な理解」をせずとも使えてしまう諸刃の剣でもあります。
  21. 21. 「本質的な理解」に近付くには ⾼レベルの抽象化されたコマンドやオプションを使 いこなせても Git がわかった感じがしない 対症療法的な解決になりがち ググってコマンド打ってみる、とか それは Git の内部を理解していないから しかしコマンドやオプションは全て理解するには数 がとても多い データに焦点を当てると覚えることが少なそう
  22. 22. と、いうことでデータ構造 の観点から Git を調べてみ ました
  23. 23. Git を実践的に使う上で⽋かせない ⾼レベルな機能 分散リポジトリ add --patch merge, pull --rebase stash, reflog rebase -i による歴史の改変
  24. 24. これらはこのスライドのスコープ外 です ⼀旦お忘れください (実践 Git と⾔っておきながら...)
  25. 25. リポジトリ .git
  26. 26. git の基本構成要素 .git は working tree 以外の情報全てをもつ Git をボトムアップから理解するより引⽤
  27. 27. リポジトリの作成 $ mkdir sandbox && cd sandbox $ git init $ tree .git .git ├── HEAD # 現在チェックアウトしてるブランチ ├── config ├── description ├── hooks │ └─各種 hook スクリプト ├── info │ └── exclude ├── objects # オブジェクトデータベース │ ├── info │ └── pack └── refs # リファレンス(ブランチ, タグなど) └── heads └── tags
  28. 28. オブジェクトデータベース .git/objects
  29. 29. .git/objects の特徴 変更(デルタ)ではなくスナップショット 各々のコミットに対するツリー構造とデ ータをまるごと保管する
  30. 30. オブジェクトの種類 オブジェクトデータベース(.git/objects)に格納されるオブジェクト blob tree commit tag (今回省略します)
  31. 31. blob object
  32. 32. データそのものを指す オブジェクト
  33. 33. オブジェクト ID は SHA-1 ハッシュ $ echo 'Hello, World!' > greeting $ git hash-object greeting 8ab686eafeb1f44702738c8b0f24f2567c36da6d
  34. 34. blob はファイル名に関係なく 中⾝が同じならば同じ ID $ echo 'Hello, World!' > greeting2 $ git hash-object greeting greeting2 8ab686eafeb1f44702738c8b0f24f2567c36da6d 8ab686eafeb1f44702738c8b0f24f2567c36da6d
  35. 35. オブジェクトはオブジェクトデータベースに ファイルで管理される 先頭2桁のディレクトリ名/残り38桁のファイル名 $ git add greeting $ tree .git .git # (⾊々省略) ├── index # インデックス └── objects └─ 8a └── b686eafeb1f44702738c8b0f24f2567c36da6d $ git cat-file -t 8ab6 blob $ git cat-file blob 8ab6 Hello, World!
  36. 36. オブジェクトは読み込み権限で作成される ⼀度作成されたオブジェクトは上書きされないことを⽰唆している $ stat -c %A .git/objects/8a/b686eafeb1f44702738c8b0f24f2567c36da6d -r--r--r--
  37. 37. 同じ内容の blob を追加してもオブジェクトは置換されない 更新時刻は変わらないので置換されていないことがわかる $ stat -c %y .git/objects/8a/b686eafeb1f44702738c8b0f24f2567c36da6d 2012-04-23 09:43:12.000000000 +0900 $ git add greeting2 $ stat -c %y .git/objects/8a/b686eafeb1f44702738c8b0f24f2567c36da6d 2012-04-23 09:43:12.000000000 +0900
  38. 38. 削除してもオブジェクトデータベースから 消えない $ git rm --cached greeting greeting2 rm 'greeting' rm 'greeting2' $ git cat-file blob 8ab6 Hello, World!
  39. 39. blob object についてわかったこと オブジェクトは SHA-1 ハッシュ ID で⼀意になる blob はデータの中⾝のみで⼀意になる オブジェクトデータベースは追記のみで更新しない 削除コマンドを実⾏しても実体は残る いわゆるイミュータブル(不変)なオブジェクト
  40. 40. tree object
  41. 41. blob にファイル構造を 与えるオブジェクト
  42. 42. tree はコミット時に作られる $ git add greeting $ git commit -m 'added my greeting.' [master (root-commit) 77d0330] added my greeting. 1 file changed, 1 insertion(+) create mode 100644 greeting $ git cat-file commit HEAD # 最新コミットの中⾝をみる tree 2da064c4206cb1e94a20a99c2cd2e19f3d193b74 author Youhei Nitta <me@youhei.jp> 1335212302 +0900 committer Youhei Nitta <me@youhei.jp> 1335212302 +0900 added my greeting. $ git cat-file -t 2da0 tree
  43. 43. tree は blob や tree を保持している $ git ls-tree 2da0 100644 blob 8ab686eafeb1f44702738c8b0f24f2567c36da6d greeting $ mkdir subdir && mv greeting2 $ git add subdir $ git commit -m 'added sub directory.' $ git ls-tree HEAD 040000 tree 18e6d2abde0f316ff62e0c8093ca8f569910bf7d subdir 100644 blob 8ab686eafeb1f44702738c8b0f24f2567c36da6d greeting $ git ls-tree 18e6 100644 blob 8ab686eafeb1f44702738c8b0f24f2567c36da6d greeting2
  44. 44. tree object についてわかったこと 構造や名前をもたない blob にファイルシステムとし ての構造を与える blob や tree を保管している tree はコミットに保持される
  45. 45. commit object
  46. 46. ある時点でのスナップショットを ⽰すオブジェクト
  47. 47. tree のオブジェクト ID を持つ $ git cat-file commit HEAD tree 680e36390174676a7343ec570f9f22d0632f4444 parent 77d03308354257e850041fd2d10448fc3a2c4c8b author Youhei Nitta <me@youhei.jp> 1335213434 +0900 committer Youhei Nitta <me@youhei.jp> 1335213434 +0900 added sub directory. $ git ls-tree commit 680e 040000 tree 18e6d2abde0f316ff62e0c8093ca8f569910bf7d subdir 100644 blob 8ab686eafeb1f44702738c8b0f24f2567c36da6d greeting
  48. 48. 親コミットのオブジェクト ID を持つ(最初のコミットを除く) $ git cat-file commit HEAD tree 680e36390174676a7343ec570f9f22d0632f4444 parent 77d03308354257e850041fd2d10448fc3a2c4c8b author Youhei Nitta <me@youhei.jp> 1335213434 +0900 committer Youhei Nitta <me@youhei.jp> 1335213434 +0900 added sub directory. $ git cat-file -t 77d0 commit $ git cat-file commit 77d0 tree 2da064c4206cb1e94a20a99c2cd2e19f3d193b74 author Youhei Nitta <me@youhei.jp> 1335212302 +0900 committer Youhei Nitta <me@youhei.jp> 1335212302 +0900 added my greeting.
  49. 49. マージコミットは⼆つの親コミットを持つ (少し⾼レベルに戻ります) $ git branch fukuoka $ git checkout fukuoka $ echo 'Hello, Fukuoka!' > greeting2 $ git add greeting2 $ git commit -m 'added another greeting.' $ git checkout master $ git merge fukuoka -m 'merged fukuoka branch.' $ git cat-file commit HEAD tree 2fb79db8e8b4ab0f704a056754b434ff2a5435b9 parent ae3bc73b86e8ea701496122f4ea7ec5e29cab979 parent 5d8fc0a8aef3930dac4347bdfda950cec83bde8c author Youhei Nitta <me@youhei.jp> 1335215713 +0900 committer Youhei Nitta <me@youhei.jp> 1335215713 +0900 merged fukuoka branch.
  50. 50. commit object についてわかったこと 必ず tree を持っている つまりコミット時点でのツリーの 完全な状態(スナップショット)を持っている parent を持っている マージコミットは parent を⼆つ持っている つまり parent を辿れば「履歴」を構成できる
  51. 51. Git の実体(エンティティ)は 基本的にはこれだけです とてもシンプルです
  52. 52. 残りの登場⼈物はふたつ インデックス リファレンス
  53. 53. インデックス .git/index
  54. 54. .git/index 次のコミットの準備をする場所 バイナリファイルにパス、パーミッシ ョン、blob 値をもつ 次の HEAD になる commit を⽣成するた めのエリア
  55. 55. .git/index は tree の鋳型 Git をボトムアップから理解するより引⽤
  56. 56. リファレンス .git/refs
  57. 57. リファレンスとは 覚えにくいオブジェクト ID の代わりに使う別名 ローカルブランチ, リモートブランチ, タグ, HEAD は 全てリファレンス
  58. 58. リファレンスの種類 references symbolic references remote references (今回省略します)
  59. 59. branch は references $ cat .git/refs/heads/master 41219f49d28b936482be893a6ca3b5a77443c78a $ git cat-file commit master tree 2fb79db8e8b4ab0f704a056754b434ff2a5435b9 parent ae3bc73b86e8ea701496122f4ea7ec5e29cab979 parent 5d8fc0a8aef3930dac4347bdfda950cec83bde8c author Youhei Nitta <me@youhei.jp> 1335215713 +0900 committer Youhei Nitta <me@youhei.jp> 1335215713 +0900 Merge branch 'fukuoka' $ git cat-file commit 41219f49d28b936482be893a6ca3b5a77443c78a tree 2fb79db8e8b4ab0f704a056754b434ff2a5435b9 parent ae3bc73b86e8ea701496122f4ea7ec5e29cab979 parent 5d8fc0a8aef3930dac4347bdfda950cec83bde8c author Youhei Nitta <me@youhei.jp> 1335215713 +0900 committer Youhei Nitta <me@youhei.jp> 1335215713 +0900 Merge branch 'fukuoka'
  60. 60. HEAD は symbolic references 他の references へのポインタで表現されている $ cat .git/refs/HEAD ref: refs/heads/master $ git symbolic-ref HEAD refs/heads/master $ git cat-file commit HEAD tree 2fb79db8e8b4ab0f704a056754b434ff2a5435b9 parent ae3bc73b86e8ea701496122f4ea7ec5e29cab979 parent 5d8fc0a8aef3930dac4347bdfda950cec83bde8c author Youhei Nitta <me@youhei.jp> 1335215713 +0900 committer Youhei Nitta <me@youhei.jp> 1335215713 +0900 Merge branch 'fukuoka'
  61. 61. tag も references $ git tag v0.0.1 $ cat .git/refs/tags/v0.0.1 41219f49d28b936482be893a6ca3b5a77443c78a $ git cat-file commit v0.0.1 tree 2fb79db8e8b4ab0f704a056754b434ff2a5435b9 parent ae3bc73b86e8ea701496122f4ea7ec5e29cab979 parent 5d8fc0a8aef3930dac4347bdfda950cec83bde8c author Youhei Nitta <me@youhei.jp> 1335215713 +0900 committer Youhei Nitta <me@youhei.jp> 1335215713 +0900 Merge branch 'fukuoka' $ git cat-file commit 41219f49d28b936482be893a6ca3b5a77443c78a tree 2fb79db8e8b4ab0f704a056754b434ff2a5435b9 parent ae3bc73b86e8ea701496122f4ea7ec5e29cab979 parent 5d8fc0a8aef3930dac4347bdfda950cec83bde8c author Youhei Nitta <me@youhei.jp> 1335215713 +0900 committer Youhei Nitta <me@youhei.jp> 1335215713 +0900 Merge branch 'fukuoka'
  62. 62. tag と branch の違い 実はほとんど同じ branch は commit に合わせて変動する 逆に tag は変動しない branch といえる
  63. 63. 以上が、Git を構成する要素の(ほぼ)全てです リポジトリ オブジェクトデータベース インデックス リファレンス
  64. 64. ここまでの低レベルな観点だけで、 下記の⾼レベルな視点に ⾃分なりの回答ができるはずです いくら分散しても⽭盾が発⽣しない理由 ブランチの切り替えが⾼速な理由 reflog で過去のどの時点にも戻れる理由 差分はどこから取り出しいつ計算するか推測 SHA-1 ハッシュ値が衝突時に Git はどう振る舞うか推測
  65. 65. おまけ SHA-1 ハッシュ値の衝突について⼩噺 SHA-1 の衝突を⾒るにはどうしたらいいのか、ひとつの例をごらんに⼊ れましょう。 地球上の⼈類 65 億⼈が全員プログラムを書いていたとします。そして その全員が、Linux カーネルのこれまでの開発履歴 (100 万の Git オブジ ェクト) と同等のコードを⼀秒で書き上げ、⾺⿅でかい単⼀の Git リポジ トリにプッシュしていくとします。これを五年間続けたとして、SHA-1 オブジェクトの衝突がひとつでも発⽣する可能性がやっと 50% になり ます。 それよりも「あなたの所属する開発チームの全メンバーが、同じ夜にそ れぞれまったく無関係の事件で全員オオカミに殺されてしまう」可能性 のほうがよっぽど⾼いことでしょう。 ProGit 6.1 リビジョンの選択 より
  66. 66. まとめ git のデータ構造はとてもシンプル 低レベルな視点を持つと⾼レベルな機能 ・問題は⾃然とわかるようになる
  67. 67. 参考資料(掘り下げたい⼈向け) Git をボトムアップから理解する ProGit 9. Git の内側 Wrangling Git ⼊⾨ Git 2章 git の基本概念 Git によるバージョン管理 13章 Git リポジトリの中⾝を⾒る gitcore-tutorial(7) git(1): LOW-LEVEL COMMANDS
  68. 68. We are hiring!! では低レベルな技術者を募集しています!
  69. 69. 質疑応答
  • StrongInTheRain

    Jul. 30, 2017
  • sakai

    Jan. 31, 2016
  • KazutoshiShinkai

    Jan. 11, 2016
  • TakahiroFutagawa

    Nov. 17, 2015
  • umejam

    Jul. 9, 2015
  • RyotaIida

    Jun. 27, 2015
  • KotaroSakae

    Apr. 27, 2015
  • takeshige

    Apr. 11, 2015
  • ryomakawajiri

    Apr. 9, 2015
  • a0pup0poo

    Mar. 29, 2015
  • suzumi4

    Mar. 25, 2015
  • shanghai2far

    Mar. 5, 2015
  • atsushiwada

    Nov. 23, 2014
  • apptaro

    Nov. 12, 2014
  • hiromikitagawa56

    Nov. 10, 2014
  • kenichinagaoka3

    Nov. 7, 2014
  • KatsuyaTokuyama

    Oct. 31, 2014
  • daiki42nd

    Oct. 20, 2014
  • PeterHan3

    Oct. 7, 2014
  • sokamo1975

    Aug. 17, 2014

gumistudy@福岡 vol.2 http://atnd.org/events/27933 original slide: http://youhei.github.io/showoff-git-lowlevel

Views

Total views

27,547

On Slideshare

0

From embeds

0

Number of embeds

14,003

Actions

Downloads

0

Shares

0

Comments

0

Likes

87

×