Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Git研修【MIXI 23新卒技術研修】

Git研修【MIXI 23新卒技術研修】

23新卒技術研修で実施したGit研修の講義資料です。

動画:https://youtu.be/lWkO8bQ9pSo

資料の利用について
公開している資料は勉強会や企業の研修などで自由にご利用頂いて大丈夫ですが、以下の形での利用だけご遠慮ください。
・受講者から参加費や授業料などを集める形での利用(会場費や飲食費など勉強会運営に必要な実費を集めるのは問題ありません)
・出典を削除または改変しての利用

MIXI ENGINEERS

April 14, 2023
Tweet

More Decks by MIXI ENGINEERS

Other Decks in Technology

Transcript

  1. 自己紹介
 
 久田 将成 (23)
 株式会社ミクシィ(現 IXI) 2022 年度新卒 


    
 
 • Fanstaでエンジニアしてます 
 ◦ ailsでサーバー書いたり ext.jsでクライアント書いたりFlutterでアプリ書いたりしてます 
 ◦ 得意領域 社食です なんでもきいてください 
 • 好きな言語 ustです もっと使っていきたい 
 • 趣味 音楽で日本 ロックがすきです 
 3
  2. 自己紹介
 
 登内 雅人 (26)
 株式会社ミクシィ(現 IXI) 2020 年度新卒 


    
 
 • みて 事業部(家族アルバム みて )で エンジニアやってます 
 ◦ CV系 研究開発したり、 ps整備したり 
 ◦ バックエンド ython, Goとか 
 ◦ #machine-learning で 系書籍 輪読会やってます(宣伝) 
 • 趣味 最近 格闘技、筋トレ、ランニング、将棋、ポーカーとかにハマってる 
 4 GitHub Pages: https://github.com/tonouchi510
  3. . 特に解説してほしいGitコマンド ありますか?
 
 • rebaseが一番多い
 
 • cherry-pickやstashなど 


    便利系コマンド
 
 こ 辺も少し解説していきます。
 事前アンケートについて
 8
  4. 事前アンケートについて
 今日 、事前アンケート 要望も取り入れつつ
 - Git 基礎
 - Git によるチーム開発

    いろ 
 - Git 内部構 
 についてやっていきます。
 最後に、今日学んだことを生かして GitChallenge に挑戦してもらいます。
 10
  5. 今日 予定
 12 shumon.fujita
 10:30 Git 基礎
 11:30 Git によるチーム開発

    いろ 
 12:00 昼食
 13:00 Git 内部構 
 15:00 GitChallenge に挑戦
 17:30 解説
 18:30 終了

  6. Git 基礎
 Git バージョン管理システム(VC ) 1 つ。
 バージョン管理と ?
 卒論.pdf

    / 卒論(1).pdf / 卒論_最新.pdf / 卒論_修正版.pdf / 卒論_最終稿.pdf / 卒論_提出用.pdf 
 
 16 shumon.fujita

  7. Git 基礎
 Git バージョン管理システム(VC ) 1 つ。
 バージョン管理と ?
 卒論.pdf

    / 卒論(1).pdf / 卒論_最新.pdf / 卒論_修正版.pdf / 卒論_最終稿.pdf / 卒論_提出用.pdf 
 → どれが最新?
 17 shumon.fujita

  8. Git 基礎
 Git バージョン管理システム(VC ) 1 つ。
 バージョン管理と ?
 卒論.pdf

    / 卒論(1).pdf / 卒論_最新.pdf / 卒論_修正版.pdf / 卒論_最終稿.pdf / 卒論_提出用.pdf 
 → どれが最新? 1 つ前 版 ? 
 
 18 shumon.fujita

  9. Git 基礎
 Git バージョン管理システム(VC ) 1 つ。
 バージョン管理と ?
 卒論.pdf

    / 卒論(1).pdf / 卒論_最新.pdf / 卒論_修正版.pdf / 卒論_最終稿.pdf / 卒論_提出用.pdf 
 → どれが最新? 1 つ前 版 ? 5 つ前 版 ? 
 
 
 19 shumon.fujita

  10. Git 基礎
 Git バージョン管理システム(VC ) 1 つ。
 バージョン管理と ?
 卒論.pdf

    / 卒論(1).pdf / 卒論_最新.pdf / 卒論_修正版.pdf / 卒論_最終稿.pdf / 卒論_提出用.pdf 
 → どれが最新? 1 つ前 版 ? 5 つ前 版 ? 
 卒論_20210118.pdf / 卒論_20210120.pdf / 卒論20210201.pdf 
 
 
 20 shumon.fujita

  11. Git 基礎
 Git バージョン管理システム(VC ) 1 つ。
 バージョン管理と ?
 卒論.pdf

    / 卒論(1).pdf / 卒論_最新.pdf / 卒論_修正版.pdf / 卒論_最終稿.pdf / 卒論_提出用.pdf 
 → どれが最新? 1 つ前 版 ? 5 つ前 版 ? 
 卒論_20210118.pdf / 卒論_20210120.pdf / 卒論20210201.pdf 
 → 新しいバージョン保存するた に容量が 2 倍 3 倍になっていく...... 
 
 
 21 shumon.fujita

  12. Git 基礎
 Git バージョン管理システム(VC ) 1 つ。
 バージョン管理と ?
 卒論.pdf

    / 卒論(1).pdf / 卒論_最新.pdf / 卒論_修正版.pdf / 卒論_最終稿.pdf / 卒論_提出用.pdf 
 → どれが最新? 1 つ前 版 ? 5 つ前 版 ? 
 卒論_20210118.pdf / 卒論_20210120.pdf / 卒論20210201.pdf 
 → 新しいバージョン保存するた に容量が 2 倍 3 倍になっていく...... 
 
 1 人で書いている卒論ならこれでもなんとかなるけど、100 人で数年かけて開発するソフトウェアならヤバイ 
 
 22 shumon.fujita

  13. Git 基礎
 Git バージョン管理システム(VC ) 1 つ。
 バージョン管理と ?
 卒論.pdf

    / 卒論(1).pdf / 卒論_最新.pdf / 卒論_修正版.pdf / 卒論_最終稿.pdf / 卒論_提出用.pdf 
 → どれが最新? 1 つ前 版 ? 5 つ前 版 ? 
 卒論_20210118.pdf / 卒論_20210120.pdf / 卒論20210201.pdf 
 → 新しいバージョン保存するた に容量が 2 倍 3 倍になっていく...... 
 
 1 人で書いている卒論ならこれでもなんとかなるけど、100 人で数年かけて開発するソフトウェアならヤバイ 
 Git を始めとする VC を使え こんな問題と おさら ! 
 
 23 shumon.fujita

  14. Git 基礎
 Git バージョン管理システム(VC ) 1 つ。
 バージョン管理と ?
 卒論.pdf

    / 卒論(1).pdf / 卒論_最新.pdf / 卒論_修正版.pdf / 卒論_最終稿.pdf / 卒論_提出用.pdf 
 → どれが最新? 1 つ前 版 ? 5 つ前 版 ? 
 卒論_20210118.pdf / 卒論_20210120.pdf / 卒論20210201.pdf 
 → 新しいバージョン保存するた に容量が 2 倍 3 倍になっていく...... 
 
 1 人で書いている卒論ならこれでもなんとかなるけど、100 人で数年かけて開発するソフトウェアならヤバイ 
 Git を始めとする VC を使え こんな問題と おさら ! 
 簡単に履歴を辿れて、容量も抑えつつ、おまけに改ざんにも強い神ツール! 
 24 shumon.fujita

  15. Git 基礎
 Git を使う上で重要な機能として branch と merge がある。 
 


    Git 単に時系列順にバージョンを管理するだけでなく、別々 時間軸 バージョンを管理できる。 
 
 26 shumon.fujita

  16. Git 基礎
 Git を使う上で重要な機能として branch と merge がある。 
 


    Git 単に時系列順にバージョンを管理するだけでなく、別々 時間軸 バージョンを管理できる。 
 さらにそれらを統合することができる。 
 27 shumon.fujita

  17. Git 基礎
 Git を使う上で重要な機能として branch と merge がある。 
 


    Git 単に時系列順にバージョンを管理するだけでなく、別々 時間軸 バージョンを管理できる。 
 さらにそれらを統合することができる。 
 別々 時間軸 ことを branch と呼 、それらを統合することを merge と言う。 
 28 shumon.fujita

  18. Git 基礎
 Git を使う上で重要な機能として branch と merge がある。 
 


    Git 単に時系列順にバージョンを管理するだけでなく、別々 時間軸 バージョンを管理できる。 
 さらにそれらを統合することができる。 
 別々 時間軸 ことを branch と呼 、それらを統合することを merge と言う。 
 
 
 
 こ merge ができる で、branchを分けて独立に進めることができる。 
 29 shumon.fujita
 元バージョン
 A
 A’
 元バージョンに
 A A’ B B’ を足したも 
 B
 B’

  19. Git 基礎
 branch と merge を経験してみる。 
 まず Git リポジトリを作って、適当に

    commit を作る。 $ mkdir hoge && cd hoge $ git init $ echo Hello > README.md $ git add README.md $ git commit -m "first commit" $ git log --oneline 45e2f9c (HEAD -> master) first commit 
 31 shumon.fujita

  20. Git 基礎
 git branch で現在作られている branch 一覧を見たり、新しい branch を作ったりできる。 


    
 $ git branch * master 
 34 shumon.fujita
 master デフォルトで
 作られる branch

  21. Git 基礎
 git branch で現在作られている branch 一覧を見たり、新しい branch を作ったりできる。 


    ちなみに Git 2.28 以降なら git config --global init.defaultBranch で init 時に作られる branch を変更できる。 
 $ git branch * master 
 35 shumon.fujita
 master デフォルトで
 作られる branch

  22. Git 基礎
 git branch で現在作られている branch 一覧を見たり、新しい branch を作ったりできる。 


    ちなみに Git 2.28 以降なら git config --global init.defaultBranch で init 時に作られる branch を変更できる。 
 $ git branch * master $ git branch develop 
 36 shumon.fujita
 master デフォルトで
 作られる branch

  23. Git 基礎
 git branch で現在作られている branch 一覧を見たり、新しい branch を作ったりできる。 


    ちなみに Git 2.28 以降なら git config --global init.defaultBranch で init 時に作られる branch を変更できる。 
 $ git branch * master $ git branch develop $ git branch develop * master 
 37 shumon.fujita
 master デフォルトで
 作られる branch

  24. Git 基礎
 git branch で現在作られている branch 一覧を見たり、新しい branch を作ったりできる。 


    ちなみに Git 2.28 以降なら git config --global init.defaultBranch で init 時に作られる branch を変更できる。 
 $ git branch * master $ git branch develop $ git branch develop * master 
 38 shumon.fujita
 master デフォルトで
 作られる branch
 develop という新しい
 branch が作られている

  25. Git 基礎
 git branch で現在作られている branch 一覧を見たり、新しい branch を作ったりできる。 


    ちなみに Git 2.28 以降なら git config --global init.defaultBranch で init 時に作られる branch を変更できる。 
 $ git branch * master $ git branch develop $ git branch develop * master 新しい branch を作っただけで、まだ master にいること 注意。 
 39 shumon.fujita
 master デフォルトで
 作られる branch
 develop という新しい
 branch が作られている

  26. Git 基礎
 branch を移動したい場合 、 git checkout を使う。
 
 $

    git branch develop * master $ git checkout develop 
 42 shumon.fujita

  27. Git 基礎
 branch を移動したい場合 、 git checkout を使う。
 
 $

    git branch develop * master $ git checkout develop $ git branch * develop master 
 43 shumon.fujita

  28. Git 基礎
 branch を移動したい場合 、 git checkout を使う。
 
 $

    git branch develop * master $ git checkout develop $ git branch * develop master 
 44 shumon.fujita
 * が現在 branch を
 表している

  29. Git 基礎
 branch を移動したい場合 、 git checkout を使う。
 あと 、それぞれ

    branch を好きに移動しながら開発を進めていく。 
 $ git branch develop * master $ git checkout develop $ git branch * develop master 
 45 shumon.fujita
 * が現在 branch を
 表している

  30. Git 基礎
 master と develop でそれぞれ開発を進める。 
 $ git log

    --oneline master e0d4607 (master) README.md に「master」と追記 76d6092 master.txt を追加 45e2f9c first commit 47 shumon.fujita

  31. Git 基礎
 master と develop でそれぞれ開発を進める。 
 $ git log

    --oneline master e0d4607 (master) README.md に「master」と追記 76d6092 master.txt を追加 45e2f9c first commit $ git log --oneline develop a81fbd0 (develop) README.md に「develop」と追記 52ad527 develop.txt を追加 45e2f9c first commit 48 shumon.fujita

  32. Git 基礎
 master と develop でそれぞれ開発を進める。 
 $ git log

    --oneline master e0d4607 (master) README.md に「master」と追記 76d6092 master.txt を追加 45e2f9c first commit $ git log --oneline develop a81fbd0 (develop) README.md に「develop」と追記 52ad527 develop.txt を追加 45e2f9c first commit first commit から、それぞれ branch に 2 コミットずつ積まれている。 49 shumon.fujita

  33. Git 基礎
 図で表すとこんな感じ。
 
 
 
 
 
 50 shumon.fujita


    first commit
 master.txt を追加
 EAD E.md に
 「master」と追記
 develop.txt を追加
 master
 EAD E.md に
 「develop」と追記
 develop

  34. Git 基礎
 図で表すとこんな感じ。次 これを merge してみる。 
 
 
 


    
 
 51 shumon.fujita
 first commit
 master.txt を追加
 EAD E.md に
 「master」と追記
 develop.txt を追加
 master
 EAD E.md に
 「develop」と追記
 develop

  35. Git 基礎
 図で表すとこんな感じ。次 これを merge してみる。 
 
 
 


    
 Git で 、「merge する branch」= “theirs”、「merge される branch」= “ours” と呼ぶ。
 
 52 shumon.fujita
 first commit
 master.txt を追加
 EAD E.md に
 「master」と追記
 develop.txt を追加
 master
 EAD E.md に
 「develop」と追記
 develop

  36. Git 基礎
 図で表すとこんな感じ。次 これを merge してみる。 
 
 
 


    
 Git で 、「merge する branch」= “theirs”、「merge される branch」= “ours” と呼ぶ。
 今回 theirs = develop, ours = master として merge していく。
 
 53 shumon.fujita
 first commit
 master.txt を追加
 EAD E.md に
 「master」と追記
 develop.txt を追加
 master
 EAD E.md に
 「develop」と追記
 develop

  37. Git 基礎
 merge するに 、ours に checkout している状態で、 git merge

    <theirs> とする。
 
 $ git branch develop * master 
 54 shumon.fujita

  38. Git 基礎
 merge するに 、ours に checkout している状態で、 git merge

    <theirs> とする。
 
 $ git branch develop * master 
 55 shumon.fujita

  39. Git 基礎
 merge するに 、ours に checkout している状態で、 git merge

    <theirs> とする。
 
 $ git branch develop * master $ git merge develop 
 56 shumon.fujita

  40. Git 基礎
 merge するに 、ours に checkout している状態で、 git merge

    <theirs> とする。
 
 $ git branch develop * master $ git merge develop Auto-merging README.md CONFLICT (content): Merge conflict in README.md Automatic merge failed; fix conflicts and then commit the result. 
 57 shumon.fujita

  41. Git 基礎
 merge するに 、ours に checkout している状態で、 git merge

    <theirs> とする。
 
 $ git branch develop * master $ git merge develop Auto-merging README.md CONFLICT (content): Merge conflict in README.md Automatic merge failed; fix conflicts and then commit the result. 
 58 shumon.fujita

  42. Git 基礎
 merge するに 、ours に checkout している状態で、 git merge

    <theirs> とする。
 EAD E.md でコンフリクト(競合)を起こして、Automatic merge に失敗した。 
 $ git branch develop * master $ git merge develop Auto-merging README.md CONFLICT (content): Merge conflict in README.md Automatic merge failed; fix conflicts and then commit the result. 
 59 shumon.fujita

  43. Git 基礎
 merge すると、Git theirs で開発した差分を自動的に ours に取り込んでくれる。 
 しかし、ours

    と theirs で同じ箇所を変更していた場合、どちら 変更を残すべきか自動的に判定できない。 
 
 
 
 61 shumon.fujita

  44. Git 基礎
 merge すると、Git theirs で開発した差分を自動的に ours に取り込んでくれる。 
 しかし、ours

    と theirs で同じ箇所を変更していた場合、どちら 変更を残すべきか自動的に判定できない。 
 → これがコンフリクト
 
 
 
 62 shumon.fujita

  45. Git 基礎
 merge すると、Git theirs で開発した差分を自動的に ours に取り込んでくれる。 
 しかし、ours

    と theirs で同じ箇所を変更していた場合、どちら 変更を残すべきか自動的に判定できない。 
 → これがコンフリクト
 
 コンフリクトが起きたら、人間が手動で差分を取り込んで、コンフリクトを解消させる必要がある。 
 
 
 63 shumon.fujita

  46. Git 基礎
 merge すると、Git theirs で開発した差分を自動的に ours に取り込んでくれる。 
 しかし、ours

    と theirs で同じ箇所を変更していた場合、どちら 変更を残すべきか自動的に判定できない。 
 → これがコンフリクト
 
 コンフリクトが起きたら、人間が手動で差分を取り込んで、コンフリクトを解消させる必要がある。 
 
 やってみる。
 
 64 shumon.fujita

  47. Git 基礎
 git status で、ど ファイルでコンフリクトしているか確認できる。 
 
 $ git

    status On branch master -- 省略 -- Unmerged paths: (use "git add <file>..." to mark resolution) both modified: README.md 
 66 shumon.fujita

  48. Git 基礎
 git status で、ど ファイルでコンフリクトしているか確認できる。 
 both modified となっているファイルがコンフリクト中。

    
 $ git status On branch master -- 省略 -- Unmerged paths: (use "git add <file>..." to mark resolution) both modified: README.md 
 67 shumon.fujita

  49. Git 基礎
 git status で、ど ファイルでコンフリクトしているか確認できる。 
 both modified となっているファイルがコンフリクト中。

    
 $ git status On branch master -- 省略 -- Unmerged paths: (use "git add <file>..." to mark resolution) both modified: README.md 今回 EAD E.md だけがコンフリクトしていることが分かる。 
 68 shumon.fujita

  50. Git 基礎
 コンフリクト中 ファイルを開け 、ど 行がど ようにコンフリクトしている か Git が教えてくれるが、

    
 自動で検出していることもあって、あまり適切でないことが多い。 
 
 
 69 shumon.fujita

  51. Git 基礎
 コンフリクト中 ファイルを開け 、ど 行がど ようにコンフリクトしている か Git が教えてくれるが、

    
 自動で検出していることもあって、あまり適切でないことが多い。 
 
 コンフリクト解消 基本 、それぞれ branch がそ ファイルに対して、 ど ような修正を施した か 、 
 意図や内容をきちんと確認してから手を付ける こと。
 
 70 shumon.fujita

  52. Git 基礎
 コンフリクト中 ファイルを開け 、ど 行がど ようにコンフリクトしている か Git が教えてくれるが、

    
 自動で検出していることもあって、あまり適切でないことが多い。 
 
 コンフリクト解消 基本 、それぞれ branch がそ ファイルに対して、 ど ような修正を施した か 、 
 意図や内容をきちんと確認してから手を付ける こと。
 ついついコンフリクト行だけを眺めて、手癖でコンフリクト解消したくなるけど、先に確認するコストと、 
 不適切な merge になってしまった場合 後始末 コストを比べたら、 絶対先に確認するべき。
 
 
 71 shumon.fujita

  53. Git 基礎
 コンフリクト中 ファイルを開け 、ど 行がど ようにコンフリクトしている か Git が教えてくれるが、

    
 自動で検出していることもあって、あまり適切でないことが多い。 
 
 コンフリクト解消 基本 、それぞれ branch がそ ファイルに対して、 ど ような修正を施した か 、 
 意図や内容をきちんと確認してから手を付ける こと。
 ついついコンフリクト行だけを眺めて、手癖でコンフリクト解消したくなるけど、先に確認するコストと、 
 不適切な merge になってしまった場合 後始末 コストを比べたら、 絶対先に確認するべき。
 → そもそもコンフリクトしている時点でプチ事故な で、めんどくさがらず慎重に 
 
 
 72 shumon.fujita

  54. Git 基礎
 コンフリクト中 ファイルを開け 、ど 行がど ようにコンフリクトしている か Git が教えてくれるが、

    
 自動で検出していることもあって、あまり適切でないことが多い。 
 
 コンフリクト解消 基本 、それぞれ branch がそ ファイルに対して、 ど ような修正を施した か 、 
 意図や内容をきちんと確認してから手を付ける こと。
 ついついコンフリクト行だけを眺めて、手癖でコンフリクト解消したくなるけど、先に確認するコストと、 
 不適切な merge になってしまった場合 後始末 コストを比べたら、 絶対先に確認するべき。
 → そもそもコンフリクトしている時点でプチ事故な で、めんどくさがらず慎重に 
 
 そ 上で、具体的にどう merge すれ 、両方 branch 修正を上手に取り込めるかを考えていく。 
 
 73 shumon.fujita

  55. Git 基礎
 ours と theirs 変更を比較したい場合、まずそれぞれ branch がどこから分岐しているかを調べる。 
 git

    merge-base <branch1> <branch2> で分岐した commit を調べられる。 
 
 
 75 shumon.fujita

  56. Git 基礎
 ours と theirs 変更を比較したい場合、まずそれぞれ branch がどこから分岐しているかを調べる。 
 git

    merge-base <branch1> <branch2> で分岐した commit を調べられる。 
 $ git merge-base master develop 45e2f9c8827024f53ca982c70676614f781205d7 
 
 
 76 shumon.fujita

  57. Git 基礎
 ours と theirs 変更を比較したい場合、まずそれぞれ branch がどこから分岐しているかを調べる。 
 git

    merge-base <branch1> <branch2> で分岐した commit を調べられる。 
 $ git merge-base master develop 45e2f9c8827024f53ca982c70676614f781205d7 
 
 
 77 shumon.fujita
 first commit
 master.txt を追加
 EAD E.md に
 「master」と追記
 develop.txt を追加
 master
 EAD E.md に
 「develop」と追記
 develop

  58. Git 基礎
 ours と theirs 変更を比較したい場合、まずそれぞれ branch がどこから分岐しているかを調べる。 
 git

    merge-base <branch1> <branch2> で分岐した commit を調べられる。 
 $ git merge-base master develop 45e2f9c8827024f53ca982c70676614f781205d7 
 
 
 78 shumon.fujita
 first commit
 master.txt を追加
 EAD E.md に
 「master」と追記
 develop.txt を追加
 master
 EAD E.md に
 「develop」と追記
 develop
 こ commit ハッシュが分かる

  59. Git 基礎
 git diff で、merge-base から EAD E.md にどんな修正を加えた か確認する。

    
 $ git diff 45e2f9c8827024f53ca982c70676614f781205d7 develop README.md 
 80 shumon.fujita

  60. Git 基礎
 git diff で、merge-base から EAD E.md にどんな修正を加えた か確認する。

    
 $ git diff 45e2f9c8827024f53ca982c70676614f781205d7 develop README.md diff --git a/README.md b/README.md index e965047..214c073 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -Hello +Hello develop 
 81 shumon.fujita

  61. Git 基礎
 git diff で、merge-base から EAD E.md にどんな修正を加えた か確認する。

    
 $ git diff 45e2f9c8827024f53ca982c70676614f781205d7 develop README.md diff --git a/README.md b/README.md index e965047..214c073 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -Hello +Hello develop $ git diff 45e2f9c8827024f53ca982c70676614f781205d7 master README.md 
 82 shumon.fujita

  62. Git 基礎
 git diff で、merge-base から EAD E.md にどんな修正を加えた か確認する。

    
 $ git diff 45e2f9c8827024f53ca982c70676614f781205d7 develop README.md diff --git a/README.md b/README.md index e965047..214c073 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -Hello +Hello develop $ git diff 45e2f9c8827024f53ca982c70676614f781205d7 master README.md diff --git a/README.md b/README.md index e965047..1ffbd88 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ -Hello +Hello master
 83 shumon.fujita

  63. Git 基礎
 結果、master と develop でやりたかったこと 次 通り。 
 -

    master : Hello → Hello master に変更 
 - develop : Hello → Hello develop に変更 
 
 
 
 
 84 shumon.fujita

  64. Git 基礎
 結果、master と develop でやりたかったこと 次 通り。 
 -

    master : Hello → Hello master に変更 
 - develop : Hello → Hello develop に変更 
 
 今回 ours が master な で、Hello master にすることにしたとする。 
 
 
 
 85 shumon.fujita

  65. Git 基礎
 結果、master と develop でやりたかったこと 次 通り。 
 -

    master : Hello → Hello master に変更 
 - develop : Hello → Hello develop に変更 
 
 今回 ours が master な で、Hello master にすることにしたとする。 
 $ emacs README.md # README.md を修正する 
 
 
 86 shumon.fujita

  66. Git 基礎
 結果、master と develop でやりたかったこと 次 通り。 
 -

    master : Hello → Hello master に変更 
 - develop : Hello → Hello develop に変更 
 
 今回 ours が master な で、Hello master にすることにしたとする。 
 $ emacs README.md # README.md を修正する $ cat README.md Hello master 
 
 
 87 shumon.fujita

  67. Git 基礎
 結果、master と develop でやりたかったこと 次 通り。 
 -

    master : Hello → Hello master に変更 
 - develop : Hello → Hello develop に変更 
 
 今回 ours が master な で、Hello master にすることにしたとする。 
 $ emacs README.md # README.md を修正する $ cat README.md Hello master $ git merge --continue 
 
 
 88 shumon.fujita

  68. Git 基礎
 結果、master と develop でやりたかったこと 次 通り。 
 -

    master : Hello → Hello master に変更 
 - develop : Hello → Hello develop に変更 
 
 今回 ours が master な で、Hello master にすることにしたとする。 
 $ emacs README.md # README.md を修正する $ cat README.md Hello master $ git merge --continue 
 これで無事コンフリクトを解消して merge できた。 
 
 89 shumon.fujita

  69. Git 基礎
 コンフリクト解消 人間 手が入るため、必要な差分が消えたり、不要な差分が混入したりする可能性がある。 
 → 大前提として、コンフリクト 起きない が

    1 番。 
 
 Git に fast-forward merge という絶対にコンフリクトが起きない merge がある。 
 
 
 
 
 92 shumon.fujita

  70. Git 基礎
 コンフリクト解消 人間 手が入るため、必要な差分が消えたり、不要な差分が混入したりする可能性がある。 
 → 大前提として、コンフリクト 起きない が

    1 番。 
 
 Git に fast-forward merge という絶対にコンフリクトが起きない merge がある。 
 fast-forward merge と 、 merge-base が ours ときに起こる merge こと。 
 
 
 
 
 93 shumon.fujita

  71. Git 基礎
 コンフリクト解消 人間 手が入るため、必要な差分が消えたり、不要な差分が混入したりする可能性がある。 
 → 大前提として、コンフリクト 起きない が

    1 番。 
 
 Git に fast-forward merge という絶対にコンフリクトが起きない merge がある。 
 fast-forward merge と 、 merge-base が ours ときに起こる merge こと。 
 さっき 例で言うと、↓ ような状態で merge すると fast-foward merge が発生する。 
 
 
 
 
 94 shumon.fujita
 first commit
 master.txt を追加
 EAD E.md に
 「master」と追記
 develop.txt を追加
 master
 EAD E.md に
 「develop」と追記
 develop

  72. Git 基礎
 コンフリクト解消 人間 手が入るため、必要な差分が消えたり、不要な差分が混入したりする可能性がある。 
 → 大前提として、コンフリクト 起きない が

    1 番。 
 
 Git に fast-forward merge という絶対にコンフリクトが起きない merge がある。 
 fast-forward merge と 、 merge-base が ours ときに起こる merge こと。 
 さっき 例で言うと、↓ ような状態で merge すると fast-foward merge が発生する。 
 
 
 
 こ 状態で merge すると、Git merge 作業をサボって、master 向き先を develop にするだけになる。 
 95 shumon.fujita
 first commit
 master.txt を追加
 EAD E.md に
 「master」と追記
 develop.txt を追加
 master
 EAD E.md に
 「develop」と追記
 develop

  73. Git 基礎
 コンフリクト解消 人間 手が入るため、必要な差分が消えたり、不要な差分が混入したりする可能性がある。 
 → 大前提として、コンフリクト 起きない が

    1 番。 
 
 Git に fast-forward merge という絶対にコンフリクトが起きない merge がある。 
 fast-forward merge と 、 merge-base が ours ときに起こる merge こと。 
 さっき 例で言うと、↓ ような状態で merge すると fast-foward merge が発生する。 
 
 
 
 こ 状態で merge すると、Git merge 作業をサボって、master 向き先を develop にするだけになる。 
 96 shumon.fujita
 first commit
 master.txt を追加
 EAD E.md に
 「master」と追記
 develop.txt を追加
 master
 EAD E.md に
 「develop」と追記
 develop

  74. Git 基礎
 100 要望 多かったrebaseについて 
 rebaseでできること そ 1 


    • ブランチ 分岐元を変更する 
 
 
 
 
 
 
 

  75. Git 基礎
 101 要望 多かったrebaseについて 
 rebaseでできること そ 1 


    • ブランチ 分岐元を変更する 
 
 
 
 
 developブランチを、最新 masterから分岐したことにする。 
 
 
 

  76. Git 基礎
 102 要望 多かったrebaseについて 
 rebaseでできること そ 1 


    • ブランチ 分岐元を変更する 
 
 
 
 
 developブランチを、最新 masterから分岐したことにする。 
 こうすると、masterにマージする際に fast-forward merge できる。 
 

  77. Git 基礎
 103 要望 多かったrebaseについて 
 rebaseでできること そ 1 


    • ブランチ 分岐元を変更する 
 
 
 
 
 developブランチを、最新 masterから分岐したことにする。 
 こうすると、masterにマージする際に fast-forward merge できる。 
 pushしてからだとややこしいことになる可能性もある で、やるならpush前 ブランチ 方が良いかも 
 

  78. Git 基礎
 104 要望 多かったrebaseについて 
 merge V rebase?
 基本的に

    mergeでよいと思う 
 ブランチが既にプッシュされていた場合、rebase コミットログを改変する で強制プッシュが必要になる。 
 
 
 

  79. Git 基礎
 要望 多かったrebaseについて 
 merge V rebase?
 rebase 使いどき(1):

    他 ブランチに追従するとき 
 
 
 
 
 例え developブランチで作業している間にmasterが進んでコンフリクトしたとする 
 ここでdevelopをmasterにrebaseすると…… 
 105 first commit
 second commit
 work 1
 Conflict!
 develop
 master

  80. Git 基礎
 要望 多かったrebaseについて 
 merge V rebase?
 rebase 使いどき(1):

    他 ブランチに追従するとき 
 
 
 
 
 例え developブランチで作業している間にmasterが進んでコンフリクトしたとする 
 ここでdevelopをmasterにrebaseすると……こうなる 
 106 first commit
 second commit
 work 1
 develop
 master
 work 1
 develop

  81. Git 基礎
 要望 多かったrebaseについて 
 merge V rebase?
 rebase 使いどき(1):

    他 ブランチに追従するとき 
 
 
 
 
 例え developブランチで作業している間にmasterが進んでコンフリクトしたとする 
 ここでdevelopをmasterにrebaseすると……こうなる 
 こうなれ 無事マージできる 
 107 first commit
 second commit
 work 1
 develop
 work 1
 develop
 merged
 master

  82. Git 基礎
 要望 多かったrebaseについて 
 merge V rebase?
 でも、無理にrebaseを使わなくてもdevelopにmasterをマージすれ 同じことができる

    
 
 
 
 
 
 (後述) commitsにマージコミットが混ざらない がrebase 利点 
 それでもやっ りdevelopで強制プッシュが必要になってしまう で 
 他 人と共有しているブランチで mergeすることが多い 
 108 first commit
 second commit
 work 1
 merge from master
 develop
 merged
 master

  83. Git 基礎
 要望 多かったrebaseについて 
 merge V rebase?
 rebase 使いどき(2):

    レビュー待ち ブランチから新しくブランチを切って作業したとき 
 
 
 
 
 
 
 branch1 既にmasterにマージ済みであるにも関わらず、 コミット一覧に work1が現れる 
 
 109 first commit
 work1
 branch1 merged
 work2
 branch1
 master
 branch2
 branch2 から master へ 
 commits
 
 • work1
 • work2

  84. Git 基礎
 要望 多かったrebaseについて 
 merge V rebase?
 ここでbranch2をmasterにrebaseすると…… 


    
 110 first commit
 work1
 branch1 merged
 work2
 branch1
 master
 branch2
 branch2 から master へ 
 commits
 
 • work1
 • work2

  85. Git 基礎
 要望 多かったrebaseについて 
 merge V rebase?
 ここでbranch2をmasterにrebaseすると……こうなる 


    
 111 first commit
 work1
 branch1 merged
 work2
 branch1
 master
 branch2
 branch2 から master へ 
 commits
 
 • work2

  86. 要望 多かったrebaseについて 
 merge V rebase?
 ここでbranch2をmasterにrebaseすると……こうなる 
 
 


    
 
 
 
 Git 基礎
 112 first commit
 work1
 branch1 merged
 work2
 branch1
 master
 branch2
 branch2 から master へ 
 commits
 
 • work2

  87. Git 基礎
 114 要望 多かったrebaseについて 
 rebaseでできること そ 2 


    • コミット履歴 修正(-iオプション) 
 ◦ コミット 並 替え
 ◦ いくつか コミットを一つに合体 
 ◦ コミットメッセージを変更
 ◦ 過去 コミットに戻って修正 

  88. Git 基礎
 115 要望 多かったrebaseについて 
 rebaseでできること そ 2 


    • コミット履歴 修正(-iオプション) 
 ◦ コミット 並 替え
 ◦ いくつか コミットを一つに合体 
 ◦ コミットメッセージを変更
 ◦ 過去 コミットに戻って修正 
 $ git rebase -i HEAD~3 # 修正を行うコミットと修正コマンドを選ぶ。コミットごとに修正が完了したら以下 $ git rebase --continue # 全て修正が終わったら完了
  89. Git 基礎
 要望 多かったrebaseについて 
 rebaseでできること そ 2 
 •

    複数 コミットを1つにまとめる例 
 116 $ git rebase -i HEAD~3
  90. Git 基礎
 要望 多かったrebaseについて 
 rebaseでできること そ 2 
 •

    複数 コミットを1つにまとめる例 
 117 1 pick 2ff810a 2st commit 2 pick 80e4e22 3rd commit 3 pick 6bb05cb 4th commit 4 5 # Rebase 17c2008..6bb05cb onto 17c2008 (3 commands) 6 # 7 # Commands: 8 # p, pick <commit> = use commit 9 # r, reword <commit> = use commit, but edit the commit message 10 # e, edit <commit> = use commit, but stop for amending 11 # s, squash <commit> = use commit, but meld into previous commit 12 # f, fixup <commit> = like "squash", but discard this commit's log message 13 # x, exec <command> = run command (the rest of the line) using shell 14 # b, break = stop here (continue rebase later with 'git rebase --continue') 15 # d, drop <commit> = remove commit 16 # l, label <label> = label current HEAD with a name 17 # t, reset <label> = reset HEAD to a label
  91. Git 基礎
 要望 多かったrebaseについて 
 rebaseでできること そ 2 
 •

    複数 コミットを1つにまとめる例 
 118 1 pick 2ff810a 2st commit 2 squash 80e4e22 3rd commit 3 squash 6bb05cb 4th commit 4 5 # Rebase 17c2008..6bb05cb onto 17c2008 (3 commands) 6 # 7 # Commands: 8 # p, pick <commit> = use commit 9 # r, reword <commit> = use commit, but edit the commit message 10 # e, edit <commit> = use commit, but stop for amending 11 # s, squash <commit> = use commit, but meld into previous commit 12 # f, fixup <commit> = like "squash", but discard this commit's log message 13 # x, exec <command> = run command (the rest of the line) using shell 14 # b, break = stop here (continue rebase later with 'git rebase --continue') 15 # d, drop <commit> = remove commit 16 # l, label <label> = label current HEAD with a name 17 # t, reset <label> = reset HEAD to a label
  92. Git 基礎
 要望 多かったrebaseについて 
 rebaseでできること そ 2 
 •

    複数 コミットを1つにまとめる例 
 119 1 pick 2ff810a 2st commit 2 squash 80e4e22 3rd commit 3 squash 6bb05cb 4th commit 4 5 # Rebase 17c2008..6bb05cb onto 17c2008 (3 commands) 6 # 7 # Commands: 8 # p, pick <commit> = use commit 9 # r, reword <commit> = use commit, but edit the commit message 10 # e, edit <commit> = use commit, but stop for amending 11 # s, squash <commit> = use commit, but meld into previous commit 12 # f, fixup <commit> = like "squash", but discard this commit's log message 13 # x, exec <command> = run command (the rest of the line) using shell 14 # b, break = stop here (continue rebase later with 'git rebase --continue') 15 # d, drop <commit> = remove commit 16 # l, label <label> = label current HEAD with a name 17 # t, reset <label> = reset HEAD to a label 3rd, 4th が 2st に吸収される
  93. 強制プッシュについて
 git push 通常、コミットを 追加すること みを許す。
 push 済み ブランチに対して rebase

    などで履歴 改変をすると通常 push を受け付けない。 
 
 
 
 
 
 Git 基礎
 122
  94. 強制プッシュについて
 git push 通常、コミットを 追加すること みを許す。
 push 済み ブランチに対して rebase

    などで履歴 改変をすると通常 push を受け付けない。 
  → そこで強制プッシュ
 
 
 
 
 
 Git 基礎
 123
  95. 強制プッシュについて
 git push 通常、コミットを 追加すること みを許す。
 push 済み ブランチに対して rebase

    などで履歴 改変をすると通常 push を受け付けない。 
  → そこで強制プッシュ
 強制プッシュ コマンド git push -f だが、有無を言わさずローカルをリモートに上書きする為危険。 
 そ ため常に以下 コマンドを使う がおすすめ。 
 git push --force-with-lease --force-if-includes 
 
 
 
 
 Git 基礎
 124
  96. bisectについて
 バグが混入したコミットを二分探索で効率的に特定するため コマンド 
 
 
 
 
 
 


    
 
 
 
 Git 基礎
 127 $ git bisect start <bad-commit> <good-commit> #チェックアウトした時点でテスト実行、もしくは動作確認 $ git bisect good (もしくは git bisect bad) #次の版にチェックアウト 1st commit
 2nd commit 
 3rd commit
 4th commit 
 5th commit 
 6th commit 
 7th commit 
 8th commit 
 9th commit 
 bad good checkout
  97. bisectについて
 バグが混入したコミットを二分探索で効率的に特定するため コマンド 
 
 
 
 
 
 


    チェック 自動化させることも可 
 
 
 
 Git 基礎
 128 $ git bisect start <bad-commit> <good-commit> #チェックアウトした時点でテスト実行、もしくは動作確認 $ git bisect good (もしくは git bisect bad) #次の版にチェックアウト 1st commit
 2nd commit 
 3rd commit
 4th commit 
 5th commit 
 6th commit 
 7th commit 
 8th commit 
 9th commit 
 bad good checkout $ git bisect start <bad-commit> <good-commit> $ git bisect run <テストスクリプトのファイル名 >
  98. submoduleについて
 あるリポジトリから、別 リポジトリを使用する必要がある時に使用 
 • サードパーティが開発したモジュール 
 • 複数 リポジトリから使われる共通モジュール

    
 
 
 
 
 
 
 Git 基礎
 133 $ git submodule add https://github.com/chaconinc/DbConnector $ git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: .gitmodules new file: DbConnector $ git submodule status # submoduleのどのコミットハッシュを参照しているか確認できる
  99. submoduleについて
 あるリポジトリから、別 リポジトリを使用する必要がある時に使用 
 • サードパーティが開発したモジュール 
 • 複数 リポジトリから使われる共通モジュール

    
 
 
 
 
 
 
 Git 基礎
 134 $ git submodule add https://github.com/chaconinc/DbConnector $ git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: .gitmodules new file: DbConnector $ git submodule status # submoduleのどのコミットハッシュを参照しているか確認できる 個人的に パッケージングできるならそ 方が好み
  100. 135 そ 他コマンド ご紹介
 - revert
 指定したコミットを打ち消すコミットを作る。 
 resetで戻すとコミットログが改変されてしまう で、コードを巻き戻す際

    revertがおすすめ。 
 - cherry-pick
 指定したコミットと同じ内容 コミットを今いるブランチに作る。 
 トラブルシューティング 際に使うことが多い。 
 - log --graph
 コマンドラインでもグラフィカルにコミットログを表示する。 --oneline もおすすめ。 
 
 
 Git 基礎

  101. そ 他コマンド ご紹介
 - stash
 現在 ワークツリーにある変更を一時的に退避する。 
 stash list

    でスタッシュ一覧が見れたり、 
 stash apply <stash番号> で変更を復元したり、 
 stash pop で直近 stashを復元しつつそ stashを削除したりできる。 
 (実質コミットみたいなも な で stash@{n} で参照できたりもする。) 
 - - (ハイフン)(コマンドじゃないけど……) 
 とつ前にいたブランチを指す。 
 git checkout - で とつ前 ブランチに戻ったり、 
 git merge - で とつ前 ブランチを現在 ブランチにマージしたりする。 
 
 136 Git 基礎

  102. Git 誕生秘話
 チーム開発 話をする前に、なぜこ 世に Git が存在するかご存知ですか 
 → inux

    を開発するため
 
 もともと inux メーリスに投稿されたパッチを、気合いで適用しながら開発していた 
 
 141 shumon.fujita

  103. Git 誕生秘話
 チーム開発 話をする前に、なぜこ 世に Git が存在するかご存知ですか 
 → inux

    を開発するため
 
 もともと inux メーリスに投稿されたパッチを、気合いで適用しながら開発していた 
 → 2002 年、「Bit eeper」という有料 VC を無料で使わせてもらえることになった 
 
 142 shumon.fujita

  104. Git 誕生秘話
 チーム開発 話をする前に、なぜこ 世に Git が存在するかご存知ですか 
 → inux

    を開発するため
 
 もともと inux メーリスに投稿されたパッチを、気合いで適用しながら開発していた 
 → 2002 年、「Bit eeper」という有料 VC を無料で使わせてもらえることになった 
 → 2005 年、なんやかんやあって、あくまで厚意で無料で使えていただけ Bit eeper を有料化されてしまった 
 
 143 shumon.fujita

  105. Git 誕生秘話
 チーム開発 話をする前に、なぜこ 世に Git が存在するかご存知ですか 
 → inux

    を開発するため
 
 もともと inux メーリスに投稿されたパッチを、気合いで適用しながら開発していた 
 → 2002 年、「Bit eeper」という有料 VC を無料で使わせてもらえることになった 
 → 2005 年、なんやかんやあって、あくまで厚意で無料で使えていただけ Bit eeper を有料化されてしまった 
 → 他 VC を探す必要がある 
 
 144 shumon.fujita

  106. Git 誕生秘話
 チーム開発 話をする前に、なぜこ 世に Git が存在するかご存知ですか 
 → inux

    を開発するため
 
 もともと inux メーリスに投稿されたパッチを、気合いで適用しながら開発していた 
 → 2002 年、「Bit eeper」という有料 VC を無料で使わせてもらえることになった 
 → 2005 年、なんやかんやあって、あくまで厚意で無料で使えていただけ Bit eeper を有料化されてしまった 
 → 他 VC を探す必要がある 
 → 他 VC inux ぐらいデカいプロジェクトを扱うに 遅すぎるし、開発者が大勢いる状態に対応できない 
 
 145 shumon.fujita

  107. Git 誕生秘話
 チーム開発 話をする前に、なぜこ 世に Git が存在するかご存知ですか 
 → inux

    を開発するため
 
 もともと inux メーリスに投稿されたパッチを、気合いで適用しながら開発していた 
 → 2002 年、「Bit eeper」という有料 VC を無料で使わせてもらえることになった 
 → 2005 年、なんやかんやあって、あくまで厚意で無料で使えていただけ Bit eeper を有料化されてしまった 
 → 他 VC を探す必要がある 
 → 他 VC inux ぐらいデカいプロジェクトを扱うに 遅すぎるし、開発者が大勢いる状態に対応できない 
 → リーナス・トーバルズ「自作するぞ」 
 
 146 shumon.fujita

  108. Git 誕生秘話
 チーム開発 話をする前に、なぜこ 世に Git が存在するかご存知ですか 
 → inux

    を開発するため
 
 もともと inux メーリスに投稿されたパッチを、気合いで適用しながら開発していた 
 → 2002 年、「Bit eeper」という有料 VC を無料で使わせてもらえることになった 
 → 2005 年、なんやかんやあって、あくまで厚意で無料で使えていただけ Bit eeper を有料化されてしまった 
 → 他 VC を探す必要がある 
 → 他 VC inux ぐらいデカいプロジェクトを扱うに 遅すぎるし、開発者が大勢いる状態に対応できない 
 → リーナス・トーバルズ「自作するぞ」 
 詳しく Git 公式ドキュメントにある Git略史 を読んでみて 
 147 shumon.fujita

  109. Git 特徴
 というわけで、Git inux 並にデカいソフトウェアを大人数で開発するために生まれた。 
 
 そ 結果、Git 以前

    VC に比べて次 ような特徴がある。 
 - 高 な merge と checkout 
 - 分散型
 - branch
 150 shumon.fujita

  110. 高 な merge と checkout
 Git merge と checkout 、実

    かなり高 
 
 
 151 shumon.fujita

  111. 高 な merge と checkout
 Git merge と checkout 、実

    かなり高 
 特に、「履歴 遠さ」 merge や checkout 時間に 影響を与えない
 
 
 152 shumon.fujita

  112. 高 な merge と checkout
 Git merge と checkout 、実

    かなり高 
 特に、「履歴 遠さ」 merge や checkout 時間に 影響を与えない
 
 → 理由 後述 Git 内部構 を聞くと分かります 
 153 shumon.fujita

  113. 分散型
 Git 解説で毎回聞くやつ。 
 
 世 中 VC (バージョン管理システム/Version Control

    ystem)に 大きく分けて集中型と分散型 2つがある。 
 
 
 155 shumon.fujita

  114. 分散型
 Git 解説で毎回聞くやつ。 
 
 世 中 VC (バージョン管理システム/Version Control

    ystem)に 大きく分けて集中型と分散型 2つがある。 
 分散型 VC 「リポジトリ 全履歴を含めた完全なコピーをローカルに持つ」 という意味。
 
 
 156 shumon.fujita

  115. 分散型
 Git 解説で毎回聞くやつ。 
 
 世 中 VC (バージョン管理システム/Version Control

    ystem)に 大きく分けて集中型と分散型 2つがある。 
 分散型 VC 「リポジトリ 全履歴を含めた完全なコピーをローカルに持つ」 という意味。
 
 例え 集中型 ubversion 、リポジトリ 完全にサーバが管理してる。 
 
 157 shumon.fujita

  116. 分散型
 Git 解説で毎回聞くやつ。 
 
 世 中 VC (バージョン管理システム/Version Control

    ystem)に 大きく分けて集中型と分散型 2つがある。 
 分散型 VC 「リポジトリ 全履歴を含めた完全なコピーをローカルに持つ」 という意味。
 
 例え 集中型 ubversion 、リポジトリ 完全にサーバが管理してる。 
 自分が触りたいファイルだけをローカルにコピーし、修正後サーバにpushする 。 
 
 158 shumon.fujita

  117. 分散型
 Git 解説で毎回聞くやつ。 
 
 世 中 VC (バージョン管理システム/Version Control

    ystem)に 大きく分けて集中型と分散型 2つがある。 
 分散型 VC 「リポジトリ 全履歴を含めた完全なコピーをローカルに持つ」 という意味。
 
 例え 集中型 ubversion 、リポジトリ 完全にサーバが管理してる。 
 自分が触りたいファイルだけをローカルにコピーし、修正後サーバにpushする 。 
 そ 間 他人 自分が使ってるファイルを編集すること できない。 
 
 159 shumon.fujita

  118. 分散型
 Git 解説で毎回聞くやつ。 
 
 世 中 VC (バージョン管理システム/Version Control

    ystem)に 大きく分けて集中型と分散型 2つがある。 
 分散型 VC 「リポジトリ 全履歴を含めた完全なコピーをローカルに持つ」 という意味。
 
 例え 集中型 ubversion 、リポジトリ 完全にサーバが管理してる。 
 自分が触りたいファイルだけをローカルにコピーし、修正後サーバにpushする 。 
 そ 間 他人 自分が使ってるファイルを編集すること できない。 
 → 大人数で開発すると開発 度が落ちる 
 
 160 shumon.fujita

  119. 分散型
 Git 解説で毎回聞くやつ。 
 
 世 中 VC (バージョン管理システム/Version Control

    ystem)に 大きく分けて集中型と分散型 2つがある。 
 分散型 VC 「リポジトリ 全履歴を含めた完全なコピーをローカルに持つ」 という意味。
 
 例え 集中型 ubversion 、リポジトリ 完全にサーバが管理してる。 
 自分が触りたいファイルだけをローカルにコピーし、修正後サーバにpushする 。 
 そ 間 他人 自分が使ってるファイルを編集すること できない。 
 → 大人数で開発すると開発 度が落ちる 
 → でも分散型 Git 誰がどんな修正をしていても無視して進めることができる 
 161 shumon.fujita

  120. branch
 Git branch 機能 おかげで、大人数で並行して開発を進めることができる。 
 でも無秩序に branch を使うとコンフリクトしまくるし、どこでど 機能が実装されている

    か分からない。 
 → 複雑なコンフリクト 仕方をすると、解消に失敗してバグが混入するかも。 
 
 
 164 shumon.fujita

  121. branch
 Git branch 機能 おかげで、大人数で並行して開発を進めることができる。 
 でも無秩序に branch を使うとコンフリクトしまくるし、どこでど 機能が実装されている

    か分からない。 
 → 複雑なコンフリクト 仕方をすると、解消に失敗してバグが混入するかも。 
 → ど branch にど 機能が実装されているか分からない で、最新版がどれな か分からない。 
 
 165 shumon.fujita

  122. branch
 Git branch 機能 おかげで、大人数で並行して開発を進めることができる。 
 でも無秩序に branch を使うとコンフリクトしまくるし、どこでど 機能が実装されている

    か分からない。 
 → 複雑なコンフリクト 仕方をすると、解消に失敗してバグが混入するかも。 
 → ど branch にど 機能が実装されているか分からない で、最新版がどれな か分からない。 
 → そういった問題を防ぐため、branch運用に 、いくつか 方法論がある。 
 166 shumon.fujita

  123. Git Flow
 Git で 、おそらく最も一般的な branch 運用。 
 皆でリモートリポジトリを1つに決めて、Git を中央集権的に扱えるようにした。

    
 → 集中型と分散型 良いとこ取りができる。 
 
 
 170 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  124. Git Flow
 Git で 、おそらく最も一般的な branch 運用。 
 皆でリモートリポジトリを1つに決めて、Git を中央集権的に扱えるようにした。

    
 → 集中型と分散型 良いとこ取りができる。 
 
 大体 チーム 、Git Flow をちょっとアレンジして使ってるんじゃないかな。 
 
 171 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  125. Git Flow
 Git で 、おそらく最も一般的な branch 運用。 
 皆でリモートリポジトリを1つに決めて、Git を中央集権的に扱えるようにした。

    
 → 集中型と分散型 良いとこ取りができる。 
 
 大体 チーム 、Git Flow をちょっとアレンジして使ってるんじゃないかな。 
 Git Flow という名前を知らなくても、慣習として Git Flow と同じようなことを 
 している人も多いと思う。
 172 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  126. Git Flow
 Git Flow で 、まずリモートリポジトリを1つに決める必要がある。 
 GitHub なり Git

    ab なり BitBucket なりなんでもいい。ちなみに弊社で 基本的にGitHub。 
 
 174 shumon.fujita

  127. Git Flow
 Git Flow で 、まずリモートリポジトリを1つに決める必要がある。 
 GitHub なり Git

    ab なり BitBucket なりなんでもいい。ちなみに弊社で 基本的にGitHub。 
 とにかくそ リモートリポジトリを開発者同士で口裏を合わせて常に正とみなす。 
 
 175 shumon.fujita

  128. Git Flow
 Git Flow で 、まずリモートリポジトリを1つに決める必要がある。 
 GitHub なり Git

    ab なり BitBucket なりなんでもいい。ちなみに弊社で 基本的にGitHub。 
 とにかくそ リモートリポジトリを開発者同士で口裏を合わせて常に正とみなす。 
 
 そんな 当たり前すぎて、逆にリモートリポジトリが複数ある状態なんて、よく分からない人もいるかも。 
 
 176 shumon.fujita

  129. Git Flow
 Git Flow で 、まずリモートリポジトリを1つに決める必要がある。 
 GitHub なり Git

    ab なり BitBucket なりなんでもいい。ちなみに弊社で 基本的にGitHub。 
 とにかくそ リモートリポジトリを開発者同士で口裏を合わせて常に正とみなす。 
 
 そんな 当たり前すぎて、逆にリモートリポジトリが複数ある状態なんて、よく分からない人もいるかも。 
 でも Git で 、複数 リモートリポジトリを持つことができる。 
 177 shumon.fujita

  130. Git Flow
 Git Flow で 、まずリモートリポジトリを1つに決める必要がある。 
 GitHub なり Git

    ab なり BitBucket なりなんでもいい。ちなみに弊社で 基本的にGitHub。 
 とにかくそ リモートリポジトリを開発者同士で口裏を合わせて常に正とみなす。 
 
 そんな 当たり前すぎて、逆にリモートリポジトリが複数ある状態なんて、よく分からない人もいるかも。 
 でも Git で 、複数 リモートリポジトリを持つことができる。 
 - GitHub ができる前から Git 使ってる 自前 Git 鯖と GitHub を両方使ってたりする。 
 178 shumon.fujita

  131. Git Flow
 Git Flow で 、まずリモートリポジトリを1つに決める必要がある。 
 GitHub なり Git

    ab なり BitBucket なりなんでもいい。ちなみに弊社で 基本的にGitHub。 
 とにかくそ リモートリポジトリを開発者同士で口裏を合わせて常に正とみなす。 
 
 そんな 当たり前すぎて、逆にリモートリポジトリが複数ある状態なんて、よく分からない人もいるかも。 
 でも Git で 、複数 リモートリポジトリを持つことができる。 
 - GitHub ができる前から Git 使ってる 自前 Git 鯖と GitHub を両方使ってたりする。 
 - fork したリポジトリを、fork 元 リポジトリに追従したいときも使ったりする。 
 179 shumon.fujita

  132. Git Flow - developとmaster
 Git Flowで最も重要な が、masterとdevelop 関係。 
 (去年

    master じゃなくて main を使おうという動きがありましたが、 原典 master を使っている でこ まま行きます) 
 
 
 180 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  133. Git Flow - developとmaster
 Git Flowで最も重要な が、masterとdevelop 関係。 
 (去年

    master じゃなくて main を使おうという動きがありましたが、 原典 master を使っている でこ まま行きます) 
 
 開発 develop で行い、 master リリース時に初めて commit される。 
 
 181 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  134. Git Flow - developとmaster
 Git Flowで最も重要な が、masterとdevelop 関係。 
 (去年

    master じゃなくて main を使おうという動きがありましたが、 原典 master を使っている でこ まま行きます) 
 
 開発 develop で行い、 master リリース時に初めて commit される。 
 master commit に リリースごとに tag を打つ。 
 
 182 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  135. Git Flow - developとmaster
 Git Flowで最も重要な が、masterとdevelop 関係。 
 (去年

    master じゃなくて main を使おうという動きがありましたが、 原典 master を使っている でこ まま行きます) 
 
 開発 develop で行い、 master リリース時に初めて commit される。 
 master commit に リリースごとに tag を打つ。 
 master 先頭が常にプロダクト 最新 リリースになる。 
 
 183 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  136. Git Flow - feature
 ここから先 、全部 develop と master をサポートするため

    branch 。 
 
 feature 複数人で develop を開発するときに使う。 
 
 
 185 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  137. Git Flow - feature
 ここから先 、全部 develop と master をサポートするため

    branch 。 
 
 feature 複数人で develop を開発するときに使う。 
 1機能ごとに develop から branch を切る。機能 開発が終われ develop に merge する。 
 
 
 186 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  138. Git Flow - feature
 ここから先 、全部 develop と master をサポートするため

    branch 。 
 
 feature 複数人で develop を開発するときに使う。 
 1機能ごとに develop から branch を切る。機能 開発が終われ develop に merge する。 
 「1 機能 = 1 feature」ルール 守ろう。複数 機能にまたがる feature デメリットが多い。 
 
 
 187 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  139. Git Flow - feature
 ここから先 、全部 develop と master をサポートするため

    branch 。 
 
 feature 複数人で develop を開発するときに使う。 
 1機能ごとに develop から branch を切る。機能 開発が終われ develop に merge する。 
 「1 機能 = 1 feature」ルール 守ろう。複数 機能にまたがる feature デメリットが多い。 
 - ど 機能がど branch に入っている か分かりにくい。 
 
 
 188 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  140. Git Flow - feature
 ここから先 、全部 develop と master をサポートするため

    branch 。 
 
 feature 複数人で develop を開発するときに使う。 
 1機能ごとに develop から branch を切る。機能 開発が終われ develop に merge する。 
 「1 機能 = 1 feature」ルール 守ろう。複数 機能にまたがる feature デメリットが多い。 
 - ど 機能がど branch に入っている か分かりにくい。 
 - 差分が大きくなってコンフリクトしやすい。 
 
 
 189 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  141. Git Flow - feature
 ここから先 、全部 develop と master をサポートするため

    branch 。 
 
 feature 複数人で develop を開発するときに使う。 
 1機能ごとに develop から branch を切る。機能 開発が終われ develop に merge する。 
 「1 機能 = 1 feature」ルール 守ろう。複数 機能にまたがる feature デメリットが多い。 
 - ど 機能がど branch に入っている か分かりにくい。 
 - 差分が大きくなってコンフリクトしやすい。 
 - revert する際 、機能単位で revert したいことがほとんど。 
 
 
 190 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  142. Git Flow - feature
 ここから先 、全部 develop と master をサポートするため

    branch 。 
 
 feature 複数人で develop を開発するときに使う。 
 1機能ごとに develop から branch を切る。機能 開発が終われ develop に merge する。 
 「1 機能 = 1 feature」ルール 守ろう。複数 機能にまたがる feature デメリットが多い。 
 - ど 機能がど branch に入っている か分かりにくい。 
 - 差分が大きくなってコンフリクトしやすい。 
 - revert する際 、機能単位で revert したいことがほとんど。 
 
 大きい機能 場合 feature からさらに feature を切ったりもする。 
 
 191 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  143. Git Flow - feature
 ここから先 、全部 develop と master をサポートするため

    branch 。 
 
 feature 複数人で develop を開発するときに使う。 
 1機能ごとに develop から branch を切る。機能 開発が終われ develop に merge する。 
 「1 機能 = 1 feature」ルール 守ろう。複数 機能にまたがる feature デメリットが多い。 
 - ど 機能がど branch に入っている か分かりにくい。 
 - 差分が大きくなってコンフリクトしやすい。 
 - revert する際 、機能単位で revert したいことがほとんど。 
 
 大きい機能 場合 feature からさらに feature を切ったりもする。 
 概念実証 ような、最終的に製品に入れるか分からないも もここ。 
 192 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  144. Git Flow - release
 release develop から master へ merge

    するため 準備をする branch 。 
 
 
 
 
 193 shumon.fujita

  145. Git Flow - release
 release develop から master へ merge

    するため 準備をする branch 。 
 チームによって 、staging という名前で呼んでるかも。 
 
 
 
 
 194 shumon.fujita

  146. Git Flow - release
 release develop から master へ merge

    するため 準備をする branch 。 
 チームによって 、staging という名前で呼んでるかも。 
 
 具体的にどんな「準備」をするか 、プロジェクトによってまちまち 
 
 
 
 195 shumon.fujita

  147. Git Flow - release
 release develop から master へ merge

    するため 準備をする branch 。 
 チームによって 、staging という名前で呼んでるかも。 
 
 具体的にどんな「準備」をするか 、プロジェクトによってまちまち 
 - 新規実装を凍結し、bugfix みに使う 
 
 
 
 196 shumon.fujita

  148. Git Flow - release
 release develop から master へ merge

    するため 準備をする branch 。 
 チームによって 、staging という名前で呼んでるかも。 
 
 具体的にどんな「準備」をするか 、プロジェクトによってまちまち 
 - 新規実装を凍結し、bugfix みに使う 
 - version 表記やタイムスタンプを更新する 
 
 
 
 197 shumon.fujita

  149. Git Flow - release
 release develop から master へ merge

    するため 準備をする branch 。 
 チームによって 、staging という名前で呼んでるかも。 
 
 具体的にどんな「準備」をするか 、プロジェクトによってまちまち 
 - 新規実装を凍結し、bugfix みに使う 
 - version 表記やタイムスタンプを更新する 
 - Apple や Google 審査 ために使う 
 
 
 
 198 shumon.fujita

  150. Git Flow - release
 release develop から master へ merge

    するため 準備をする branch 。 
 チームによって 、staging という名前で呼んでるかも。 
 
 具体的にどんな「準備」をするか 、プロジェクトによってまちまち 
 - 新規実装を凍結し、bugfix みに使う 
 - version 表記やタイムスタンプを更新する 
 - Apple や Google 審査 ために使う 
 
 いずれにしても、release master へ commit する( = ユーザ 手に渡る)まで 、最終段階にあたる で、 
 release で新機能を追加する ご法度。 
 199 shumon.fujita

  151. Git Flow - hotfix
 hotfix 本番環境で発生したバグ 内、緊急性 高いも を修正するため branch。

    
 
 
 200 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  152. Git Flow - hotfix
 hotfix 本番環境で発生したバグ 内、緊急性 高いも を修正するため branch。

    
 
 develop 以外で、唯一 master から切られる branch 。 
 
 201 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  153. Git Flow - hotfix
 hotfix 本番環境で発生したバグ 内、緊急性 高いも を修正するため branch。

    
 
 develop 以外で、唯一 master から切られる branch 。 
 修正が完了したら master と develop (or release)に merge する。 
 
 202 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  154. Git Flow - hotfix
 hotfix 本番環境で発生したバグ 内、緊急性 高いも を修正するため branch。

    
 
 develop 以外で、唯一 master から切られる branch 。 
 修正が完了したら master と develop (or release)に merge する。 
 
 hotfix から master を更新した場合 、patch バージョンを上げることが多い。 
 (1.2 → 1.3 で なく、1.2 → 1.2.1) 
 203 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  155. Git Flow
 ここまで 話を全部まとめると、右 図になる。 
 
 
 
 


    204 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  156. Git Flow
 ここまで 話を全部まとめると、右 図になる。 
 
 前述 通り、大体 チームで

    Git Flowをそ ままで なく、 
 
 
 
 205 shumon.fujita
 https://nvie.com/posts/a-successful-git-branching-model/
  157. Git Flow
 ここまで 話を全部まとめると、右 図になる。 
 
 前述 通り、大体 チームで

    Git Flowをそ ままで なく、 
 ちょっとアレンジして使っていると思う。 
 
 
 
 206 https://nvie.com/posts/a-successful-git-branching-model/
  158. Git Flow
 ここまで 話を全部まとめると、右 図になる。 
 
 前述 通り、大体 チームで

    Git Flowをそ ままで なく、 
 ちょっとアレンジして使っていると思う。 
 
 他にもGitHub Flowとか、トランクベース開発など 手法もある。 
 
 
 
 207 https://nvie.com/posts/a-successful-git-branching-model/
  159. Git Flow
 ここまで 話を全部まとめると、右 図になる。 
 
 前述 通り、大体 チームで

    Git Flowをそ ままで なく、 
 ちょっとアレンジして使っていると思う。 
 
 他にもGitHub Flowとか、トランクベース開発など 手法もある。 
 
 組織やリポジトリ 特性などから適したも を選んで行ってください。 
 
 
 
 208 https://nvie.com/posts/a-successful-git-branching-model/
  160. GitHub について
 Git 単体で使う で なく、リポジトリホスティングサービスと併用することで Git 真価を発揮する。 
 弊社で

    GitHub を使っている で、GitHub 機能について話します。 
 
 
 
 
 211 shumon.fujita

  161. GitHub について
 Git 単体で使う で なく、リポジトリホスティングサービスと併用することで Git 真価を発揮する。 
 弊社で

    GitHub を使っている で、GitHub 機能について話します。 
 
 GitHub Git をチームで使うにあたって便利な機能がいっ い入っている 
 
 
 
 212 shumon.fujita

  162. GitHub について
 Git 単体で使う で なく、リポジトリホスティングサービスと併用することで Git 真価を発揮する。 
 弊社で

    GitHub を使っている で、GitHub 機能について話します。 
 
 GitHub Git をチームで使うにあたって便利な機能がいっ い入っている 
 基本的な機能 リポジトリ トップページ タブでまとめられている。 
 
 
 
 213 shumon.fujita

  163. GitHub について
 Git 単体で使う で なく、リポジトリホスティングサービスと併用することで Git 真価を発揮する。 
 弊社で

    GitHub を使っている で、GitHub 機能について話します。 
 
 GitHub Git をチームで使うにあたって便利な機能がいっ い入っている 
 基本的な機能 リポジトリ トップページ タブでまとめられている。 
 でも意外と全部 タブ開いたことない人もいるんじゃないかな。 
 
 
 
 214 shumon.fujita

  164. GitHub について
 Git 単体で使う で なく、リポジトリホスティングサービスと併用することで Git 真価を発揮する。 
 弊社で

    GitHub を使っている で、GitHub 機能について話します。 
 
 GitHub Git をチームで使うにあたって便利な機能がいっ い入っている 
 基本的な機能 リポジトリ トップページ タブでまとめられている。 
 でも意外と全部 タブ開いたことない人もいるんじゃないかな。 
 
 
 まず Issues 機能から解説していく。 
 
 215 shumon.fujita

  165. Issue について
 気になったことをなんでも arkdownで書いておくところ。 
 (実際 運用 チームによるけど大体 ところ 何書いても良いと思う)

    
 ここに実タスクを並べて、後述 rojectsで管理するチームもあれ 、
 「テストが遅いから改善したい」とか「あ 負債をどうやって解消しよう」とか 
 相談事を書いて議論 土台にするチームもある。
 
 219 shumon.fujita

  166. Issue について
 気になったことをなんでも arkdownで書いておくところ。 
 (実際 運用 チームによるけど大体 ところ 何書いても良いと思う)

    
 ここに実タスクを並べて、後述 rojectsで管理するチームもあれ 、
 「テストが遅いから改善したい」とか「あ 負債をどうやって解消しよう」とか 
 相談事を書いて議論 土台にするチームもある。
 ラベルをつけて、種類別に整理しやすくしたり、
 
 220 shumon.fujita

  167. Issue について
 気になったことをなんでも arkdownで書いておくところ。 
 (実際 運用 チームによるけど大体 ところ 何書いても良いと思う)

    
 ここに実タスクを並べて、後述 rojectsで管理するチームもあれ 、
 「テストが遅いから改善したい」とか「あ 負債をどうやって解消しよう」とか 
 相談事を書いて議論 土台にするチームもある。
 ラベルをつけて、種類別に整理しやすくしたり、
 マイルストーンをつけて、いつまでに対応するべきな かを明確化 したり、
 
 221 shumon.fujita

  168. Issue について
 気になったことをなんでも arkdownで書いておくところ。 
 (実際 運用 チームによるけど大体 ところ 何書いても良いと思う)

    
 ここに実タスクを並べて、後述 rojectsで管理するチームもあれ 、
 「テストが遅いから改善したい」とか「あ 負債をどうやって解消しよう」とか 
 相談事を書いて議論 土台にするチームもある。
 ラベルをつけて、種類別に整理しやすくしたり、
 マイルストーンをつけて、いつまでに対応するべきな かを明確化 したり、
 特定 issueに誰かをassignして対応を任せたり。
 
 222 shumon.fujita

  169. Issue について
 気になったことをなんでも arkdownで書いておくところ。 
 (実際 運用 チームによるけど大体 ところ 何書いても良いと思う)

    
 ここに実タスクを並べて、後述 rojectsで管理するチームもあれ 、
 「テストが遅いから改善したい」とか「あ 負債をどうやって解消しよう」とか 
 相談事を書いて議論 土台にするチームもある。
 ラベルをつけて、種類別に整理しやすくしたり、
 マイルストーンをつけて、いつまでに対応するべきな かを明確化 したり、
 特定 issueに誰かをassignして対応を任せたり。
 まあいっ いできる。
 223 shumon.fujita

  170. ull equest について
 GitHub 関連 機能で一番重要。 
 
 特定 branch

    や、fork 元 リポジトリに、「私がやった作業を取り込んでくれ」とお願いを出せる機能。 
 
 
 225 shumon.fujita

  171. ull equest について
 GitHub 関連 機能で一番重要。 
 
 特定 branch

    や、fork 元 リポジトリに、「私がやった作業を取り込んでくれ」とお願いを出せる機能。 
 → 元々 fork 元 リポジトリにお願いする機能な で “ erge equest” で なく “ ull equest”
 
 
 226 shumon.fujita

  172. ull equest について
 GitHub 関連 機能で一番重要。 
 
 特定 branch

    や、fork 元 リポジトリに、「私がやった作業を取り込んでくれ」とお願いを出せる機能。 
 → 元々 fork 元 リポジトリにお願いする機能な で “ erge equest” で なく “ ull equest”
 
 お願いされた側 取り込む前に差分をよく吟味し、大丈夫そうなら merge して差分を取り込む。 
 
 227 shumon.fujita

  173. ull equest について
 GitHub 関連 機能で一番重要。 
 
 特定 branch

    や、fork 元 リポジトリに、「私がやった作業を取り込んでくれ」とお願いを出せる機能。 
 → 元々 fork 元 リポジトリにお願いする機能な で “ erge equest” で なく “ ull equest”
 
 お願いされた側 取り込む前に差分をよく吟味し、大丈夫そうなら merge して差分を取り込む。 
 ダメそうならダメなポイントを指摘してあげる。 
 
 228 shumon.fujita

  174. ull equest について
 GitHub 関連 機能で一番重要。 
 
 特定 branch

    や、fork 元 リポジトリに、「私がやった作業を取り込んでくれ」とお願いを出せる機能。 
 → 元々 fork 元 リポジトリにお願いする機能な で “ erge equest” で なく “ ull equest”
 
 お願いされた側 取り込む前に差分をよく吟味し、大丈夫そうなら merge して差分を取り込む。 
 ダメそうならダメなポイントを指摘してあげる。 
 ↑いわゆるコードレビュー
 229 shumon.fujita

  175. を出す側 注意点
 - できるだけ細かい単位で を出すよう心がける 
 - 巨大 レビューに時間がかかる 


    - レビューに時間がかかると merge まで 時間も当然伸 る 
 233 shumon.fujita

  176. を出す側 注意点
 - できるだけ細かい単位で を出すよう心がける 
 - 巨大 レビューに時間がかかる 


    - レビューに時間がかかると merge まで 時間も当然伸 る 
 - 別 がどんどん先に merge されていく 
 
 234 shumon.fujita

  177. を出す側 注意点
 - できるだけ細かい単位で を出すよう心がける 
 - 巨大 レビューに時間がかかる 


    - レビューに時間がかかると merge まで 時間も当然伸 る 
 - 別 がどんどん先に merge されていく 
 - そ 結果コンフリクトする
 235 shumon.fujita

  178. を出す側 注意点
 - できるだけ細かい単位で を出すよう心がける 
 - 巨大 レビューに時間がかかる 


    - レビューに時間がかかると merge まで 時間も当然伸 る 
 - 別 がどんどん先に merge されていく 
 - そ 結果コンフリクトする
 - さらにコンフリクト 解消に失敗してバグるかも 
 
 236 shumon.fujita

  179. を出す側 注意点
 - できるだけ細かい単位で を出すよう心がける 
 - 巨大 レビューに時間がかかる 


    - レビューに時間がかかると merge まで 時間も当然伸 る 
 - 別 がどんどん先に merge されていく 
 - そ 結果コンフリクトする
 - さらにコンフリクト 解消に失敗してバグるかも 
 - 巨大にならざるをえないとき 、途中でレビューしてもらう 
 237 shumon.fujita

  180. を出す側 注意点
 - できるだけ細かい単位で を出すよう心がける 
 - 巨大 レビューに時間がかかる 


    - レビューに時間がかかると merge まで 時間も当然伸 る 
 - 別 がどんどん先に merge されていく 
 - そ 結果コンフリクトする
 - さらにコンフリクト 解消に失敗してバグるかも 
 - 巨大にならざるをえないとき 、途中でレビューしてもらう 
 - Git Flow で少し話をした、feature から feature を切るテク 
 
 238 shumon.fujita

  181. を出す側 注意点
 - できるだけ細かい単位で を出すよう心がける 
 - 巨大 レビューに時間がかかる 


    - レビューに時間がかかると merge まで 時間も当然伸 る 
 - 別 がどんどん先に merge されていく 
 - そ 結果コンフリクトする
 - さらにコンフリクト 解消に失敗してバグるかも 
 - 巨大にならざるをえないとき 、途中でレビューしてもらう 
 - Git Flow で少し話をした、feature から feature を切るテク 
 - 最初 feature に WI をタイトルに付けたり、draft として出したりすると ◦ 
 239 shumon.fujita

  182. を出す側 注意点
 - できるだけ細かい単位で を出すよう心がける 
 - 巨大 レビューに時間がかかる 


    - レビューに時間がかかると merge まで 時間も当然伸 る 
 - 別 がどんどん先に merge されていく 
 - そ 結果コンフリクトする
 - さらにコンフリクト 解消に失敗してバグるかも 
 - 巨大にならざるをえないとき 、途中でレビューしてもらう 
 - Git Flow で少し話をした、feature から feature を切るテク 
 - 最初 feature に WI をタイトルに付けたり、draft として出したりすると ◦ 
 - コミットログ できるだけ綺麗にしておこう 
 
 240 shumon.fujita

  183. を出す側 注意点
 - できるだけ細かい単位で を出すよう心がける 
 - 巨大 レビューに時間がかかる 


    - レビューに時間がかかると merge まで 時間も当然伸 る 
 - 別 がどんどん先に merge されていく 
 - そ 結果コンフリクトする
 - さらにコンフリクト 解消に失敗してバグるかも 
 - 巨大にならざるをえないとき 、途中でレビューしてもらう 
 - Git Flow で少し話をした、feature から feature を切るテク 
 - 最初 feature に WI をタイトルに付けたり、draft として出したりすると ◦ 
 - コミットログ できるだけ綺麗にしておこう 
 - こまめにコミットし、できれ 最後に git rebase -i で体裁を整えよう
 241 shumon.fujita

  184. を出す側 注意点
 - できるだけ細かい単位で を出すよう心がける 
 - 巨大 レビューに時間がかかる 


    - レビューに時間がかかると merge まで 時間も当然伸 る 
 - 別 がどんどん先に merge されていく 
 - そ 結果コンフリクトする
 - さらにコンフリクト 解消に失敗してバグるかも 
 - 巨大にならざるをえないとき 、途中でレビューしてもらう 
 - Git Flow で少し話をした、feature から feature を切るテク 
 - 最初 feature に WI をタイトルに付けたり、draft として出したりすると ◦ 
 - コミットログ できるだけ綺麗にしておこう 
 - こまめにコミットし、できれ 最後に git rebase -i で体裁を整えよう
 - 厳しめ だと fast-forward merge できないだけでもダメって言われたりする 
 
 242 shumon.fujita

  185. を出す側 注意点
 - できるだけ細かい単位で を出すよう心がける 
 - 巨大 レビューに時間がかかる 


    - レビューに時間がかかると merge まで 時間も当然伸 る 
 - 別 がどんどん先に merge されていく 
 - そ 結果コンフリクトする
 - さらにコンフリクト 解消に失敗してバグるかも 
 - 巨大にならざるをえないとき 、途中でレビューしてもらう 
 - Git Flow で少し話をした、feature から feature を切るテク 
 - 最初 feature に WI をタイトルに付けたり、draft として出したりすると ◦ 
 - コミットログ できるだけ綺麗にしておこう 
 - こまめにコミットし、できれ 最後に git rebase -i で体裁を整えよう
 - 厳しめ だと fast-forward merge できないだけでもダメって言われたりする 
 - こ 辺 賛否ある で所属チームに合わせると良さそう 
 243 shumon.fujita

  186. を見る側 注意点
 - 機械的にチェックできる部分 CI に任せる 
 - テスト しっかり書こう

    
 - コードフォーマッタを使うと、細かいスペース 差分とかが生まれなくて便利 
 247 shumon.fujita

  187. を見る側 注意点
 - 機械的にチェックできる部分 CI に任せる 
 - テスト しっかり書こう

    
 - コードフォーマッタを使うと、細かいスペース 差分とかが生まれなくて便利 
 - 人間が見るべきポイントにしっかり集中する 
 248 shumon.fujita

  188. を見る側 注意点
 - 機械的にチェックできる部分 CI に任せる 
 - テスト しっかり書こう

    
 - コードフォーマッタを使うと、細かいスペース 差分とかが生まれなくて便利 
 - 人間が見るべきポイントにしっかり集中する 
 - 仕様 穴、セキュリティ/法的にヤバそうなところ 
 
 249 shumon.fujita

  189. を見る側 注意点
 - 機械的にチェックできる部分 CI に任せる 
 - テスト しっかり書こう

    
 - コードフォーマッタを使うと、細かいスペース 差分とかが生まれなくて便利 
 - 人間が見るべきポイントにしっかり集中する 
 - 仕様 穴、セキュリティ/法的にヤバそうなところ 
 - 負債になりそうなところ、設計的にまずいところ、計算量・レイテンシ的に厳しいところ 
 250 shumon.fujita

  190. を見る側 注意点
 - 機械的にチェックできる部分 CI に任せる 
 - テスト しっかり書こう

    
 - コードフォーマッタを使うと、細かいスペース 差分とかが生まれなくて便利 
 - 人間が見るべきポイントにしっかり集中する 
 - 仕様 穴、セキュリティ/法的にヤバそうなところ 
 - 負債になりそうなところ、設計的にまずいところ、計算量・レイテンシ的に厳しいところ 
 - 意外と実装中に気づかなかった問題点が見つかることも多い で、自分 もレビューしておくと吉 
 251 shumon.fujita

  191. を見る側 注意点
 - 機械的にチェックできる部分 CI に任せる 
 - テスト しっかり書こう

    
 - コードフォーマッタを使うと、細かいスペース 差分とかが生まれなくて便利 
 - 人間が見るべきポイントにしっかり集中する 
 - 仕様 穴、セキュリティ/法的にヤバそうなところ 
 - 負債になりそうなところ、設計的にまずいところ、計算量・レイテンシ的に厳しいところ 
 - 意外と実装中に気づかなかった問題点が見つかることも多い で、自分 もレビューしておくと吉 
 - なかなか人間 目で バグ 見つかりません!高品質なコード 高品質なテストから 
 252 shumon.fujita

  192. を見る側 注意点
 - 機械的にチェックできる部分 CI に任せる 
 - テスト しっかり書こう

    
 - コードフォーマッタを使うと、細かいスペース 差分とかが生まれなくて便利 
 - 人間が見るべきポイントにしっかり集中する 
 - 仕様 穴、セキュリティ/法的にヤバそうなところ 
 - 負債になりそうなところ、設計的にまずいところ、計算量・レイテンシ的に厳しいところ 
 - 意外と実装中に気づかなかった問題点が見つかることも多い で、自分 もレビューしておくと吉 
 - なかなか人間 目で バグ 見つかりません!高品質なコード 高品質なテストから 
 - 実装者 ことを思いやる
 253 shumon.fujita

  193. を見る側 注意点
 - 機械的にチェックできる部分 CI に任せる 
 - テスト しっかり書こう

    
 - コードフォーマッタを使うと、細かいスペース 差分とかが生まれなくて便利 
 - 人間が見るべきポイントにしっかり集中する 
 - 仕様 穴、セキュリティ/法的にヤバそうなところ 
 - 負債になりそうなところ、設計的にまずいところ、計算量・レイテンシ的に厳しいところ 
 - 意外と実装中に気づかなかった問題点が見つかることも多い で、自分 もレビューしておくと吉 
 - なかなか人間 目で バグ 見つかりません!高品質なコード 高品質なテストから 
 - 実装者 ことを思いやる
 - 「こ コード 良くない」 ような抽象的な言い方 やめて、どこがどういう理由で良くない か書く 
 254 shumon.fujita

  194. を見る側 注意点
 - 機械的にチェックできる部分 CI に任せる 
 - テスト しっかり書こう

    
 - コードフォーマッタを使うと、細かいスペース 差分とかが生まれなくて便利 
 - 人間が見るべきポイントにしっかり集中する 
 - 仕様 穴、セキュリティ/法的にヤバそうなところ 
 - 負債になりそうなところ、設計的にまずいところ、計算量・レイテンシ的に厳しいところ 
 - 意外と実装中に気づかなかった問題点が見つかることも多い で、自分 もレビューしておくと吉 
 - なかなか人間 目で バグ 見つかりません!高品質なコード 高品質なテストから 
 - 実装者 ことを思いやる
 - 「こ コード 良くない」 ような抽象的な言い方 やめて、どこがどういう理由で良くない か書く 
 - 合わせて、どういう方法なら良い かも書けると議論もしやすい 
 
 255 shumon.fujita

  195. を見る側 注意点
 - 機械的にチェックできる部分 CI に任せる 
 - テスト しっかり書こう

    
 - コードフォーマッタを使うと、細かいスペース 差分とかが生まれなくて便利 
 - 人間が見るべきポイントにしっかり集中する 
 - 仕様 穴、セキュリティ/法的にヤバそうなところ 
 - 負債になりそうなところ、設計的にまずいところ、計算量・レイテンシ的に厳しいところ 
 - 意外と実装中に気づかなかった問題点が見つかることも多い で、自分 もレビューしておくと吉 
 - なかなか人間 目で バグ 見つかりません!高品質なコード 高品質なテストから 
 - 実装者 ことを思いやる
 - 「こ コード 良くない」 ような抽象的な言い方 やめて、どこがどういう理由で良くない か書く 
 - 合わせて、どういう方法なら良い かも書けると議論もしやすい 
 - 定量的な指標もあったりする でそういう も活用すると良いかも 
 256 shumon.fujita

  196. を見る側 注意点
 - 機械的にチェックできる部分 CI に任せる 
 - テスト しっかり書こう

    
 - コードフォーマッタを使うと、細かいスペース 差分とかが生まれなくて便利 
 - 人間が見るべきポイントにしっかり集中する 
 - 仕様 穴、セキュリティ/法的にヤバそうなところ 
 - 負債になりそうなところ、設計的にまずいところ、計算量・レイテンシ的に厳しいところ 
 - 意外と実装中に気づかなかった問題点が見つかることも多い で、自分 もレビューしておくと吉 
 - なかなか人間 目で バグ 見つかりません!高品質なコード 高品質なテストから 
 - 実装者 ことを思いやる
 - 「こ コード 良くない」 ような抽象的な言い方 やめて、どこがどういう理由で良くない か書く 
 - 合わせて、どういう方法なら良い かも書けると議論もしやすい 
 - 定量的な指標もあったりする でそういう も活用すると良いかも 
 - テキストで 指摘 、結構キツく感じてしまいがちな で、普段 1.5倍やさしい言葉使いをしよう 
 257 shumon.fujita

  197. を見る側 注意点
 - 機械的にチェックできる部分 CI に任せる 
 - テスト しっかり書こう

    
 - コードフォーマッタを使うと、細かいスペース 差分とかが生まれなくて便利 
 - 人間が見るべきポイントにしっかり集中する 
 - 仕様 穴、セキュリティ/法的にヤバそうなところ 
 - 負債になりそうなところ、設計的にまずいところ、計算量・レイテンシ的に厳しいところ 
 - 意外と実装中に気づかなかった問題点が見つかることも多い で、自分 もレビューしておくと吉 
 - なかなか人間 目で バグ 見つかりません!高品質なコード 高品質なテストから 
 - 実装者 ことを思いやる
 - 「こ コード 良くない」 ような抽象的な言い方 やめて、どこがどういう理由で良くない か書く 
 - 合わせて、どういう方法なら良い かも書けると議論もしやすい 
 - 定量的な指標もあったりする でそういう も活用すると良いかも 
 - テキストで 指摘 、結構キツく感じてしまいがちな で、普段 1.5倍やさしい言葉使いをしよう 
 - H (謙虚・尊敬・信頼) 原則 
 258 shumon.fujita

  198. Actions について
 GitHub が提供している CI/CD 環境。 
 他 サービスと連携させる必要がない で、簡単に使える

    + パブリックリポジトリで 無料で使える点がメリット。 
 
 
 260 shumon.fujita

  199. Actions について
 GitHub が提供している CI/CD 環境。 
 他 サービスと連携させる必要がない で、簡単に使える

    + パブリックリポジトリで 無料で使える点がメリット。 
 また、汎用的な部分 GitHub で公開されている Action を利用することができることもありがたい。 
 
 
 261 shumon.fujita

  200. Actions について
 GitHub が提供している CI/CD 環境。 
 他 サービスと連携させる必要がない で、簡単に使える

    + パブリックリポジトリで 無料で使える点がメリット。 
 また、汎用的な部分 GitHub で公開されている Action を利用することができることもありがたい。 
 
 hook したいイベントとワークフローを書いた yaml を .github/workflows/ に配置すると、勝手に走ってくれる。 
 
 262 shumon.fujita

  201. Actions について
 GitHub が提供している CI/CD 環境。 
 他 サービスと連携させる必要がない で、簡単に使える

    + パブリックリポジトリで 無料で使える点がメリット。 
 また、汎用的な部分 GitHub で公開されている Action を利用することができることもありがたい。 
 
 hook したいイベントとワークフローを書いた yaml を .github/workflows/ に配置すると、勝手に走ってくれる。 
 → 具体的な書き方 公式ドキュメント を読んでください。
 
 263 shumon.fujita

  202. Actions について
 GitHub が提供している CI/CD 環境。 
 他 サービスと連携させる必要がない で、簡単に使える

    + パブリックリポジトリで 無料で使える点がメリット。 
 また、汎用的な部分 GitHub で公開されている Action を利用することができることもありがたい。 
 
 hook したいイベントとワークフローを書いた yaml を .github/workflows/ に配置すると、勝手に走ってくれる。 
 → 具体的な書き方 公式ドキュメント を読んでください。
 
 264 shumon.fujita

  203. rojects について
 カンバンスタイル タスク管理ツール。 
 アジャイルとかスクラム開発でよく使う。 
 
 
 issue

    や を付箋 ようにタブを移動 
 させて進捗状況を可視化できる。 
 
 
 267 shumon.fujita

  204. rojects について
 カンバンスタイル タスク管理ツール。 
 アジャイルとかスクラム開発でよく使う。 
 
 
 issue

    や を付箋 ようにタブを移動 
 させて進捗状況を可視化できる。 
 
 機能も少ないため、実際に あまり使っている部署 ないかも(?) 
 
 
 268 shumon.fujita

  205. rojects について
 カンバンスタイル タスク管理ツール。 
 アジャイルとかスクラム開発でよく使う。 
 
 
 issue

    や を付箋 ようにタブを移動 
 させて進捗状況を可視化できる。 
 
 機能も少ないため、実際に あまり使っている部署 ないかも(?) 
 ZenHubという有料拡張ツールつかうとかなり便利になる。 
 
 269 shumon.fujita

  206. Wiki について
 いわゆる Wiki を究極にシンプルにしたやつ。 
 基本的にチームメンバーが自由に記事を追加・編集・削除できるだけ 機能。 
 


    機能がかなり貧弱な で、ちゃんと運用してるチーム 多分あんまりないんじゃないかなと思う。 
 docbase 契約してる で、docbase で良さそう... 
 272 shumon.fujita

  207. ecurity について
 主に↓ 3 つ 機能について あれこれをするタブ。 
 - ecurity

    olicy
 - ecurity Advisories
 - Dependabot
 
 
 
 
 273 shumon.fujita

  208. ecurity について
 主に↓ 3 つ 機能について あれこれをするタブ。 
 - ecurity

    olicy
 - ecurity Advisories
 - Dependabot
 
 ecurity olicy 脆弱性報告 手順を arkdown で書いておく。 
 
 
 
 274 shumon.fujita

  209. ecurity について
 主に↓ 3 つ 機能について あれこれをするタブ。 
 - ecurity

    olicy
 - ecurity Advisories
 - Dependabot
 
 ecurity olicy 脆弱性報告 手順を arkdown で書いておく。 
 ecurity Advisories 非公開 issue ようなも で、脆弱性が対策されるまで 秘匿した状態で議論し、 
 対応パッチがリリースされると、そ 議論を公開できる。 
 
 
 275 shumon.fujita

  210. ecurity について
 主に↓ 3 つ 機能について あれこれをするタブ。 
 - ecurity

    olicy
 - ecurity Advisories
 - Dependabot
 
 ecurity olicy 脆弱性報告 手順を arkdown で書いておく。 
 ecurity Advisories 非公開 issue ようなも で、脆弱性が対策されるまで 秘匿した状態で議論し、 
 対応パッチがリリースされると、そ 議論を公開できる。 
 Dependabot コードから依存パッケージ バージョンを解析して、脆弱性があれ アラートを飛 してくれる。 
 
 
 276 shumon.fujita

  211. ecurity について
 主に↓ 3 つ 機能について あれこれをするタブ。 
 - ecurity

    olicy
 - ecurity Advisories
 - Dependabot
 
 ecurity olicy 脆弱性報告 手順を arkdown で書いておく。 
 ecurity Advisories 非公開 issue ようなも で、脆弱性が対策されるまで 秘匿した状態で議論し、 
 対応パッチがリリースされると、そ 議論を公開できる。 
 Dependabot コードから依存パッケージ バージョンを解析して、脆弱性があれ アラートを飛 してくれる。 
 
 → Dependabot 以外 パブリックリポジトリでしか使い道がない で、基本的に ため 機能。 
 277 shumon.fujita

  212. Insights について
 リポジトリ 活発度を色々な指標で確認できる場所。 
 
 時系列でコミット数や差分 量がグラフ化されていたり、リポジトリ 色々な統計情報が見られる。 


    
 自分 リポジトリでこ タブを使うこと あんまりない。 
 
 新しいライブラリやツール 導入を検討しているとき、それが GitHub でホストされているならこ タブを見ると、 
 どれくらいメンテされている かが一目瞭然な で、ぜ 使ってみて 。 
 281 shumon.fujita

  213. ettings について
 リポジトリ 設定を変えるタブ(それ そう) 
 
 各種機能 on/off や、

    ecrets 登録、デフォルトブランチ 変更、 マージに関するルール 設定など色々できる。 
 
 
 
 283 shumon.fujita

  214. ettings について
 リポジトリ 設定を変えるタブ(それ そう) 
 
 各種機能 on/off や、

    ecrets 登録、デフォルトブランチ 変更、 マージに関するルール 設定など色々できる。 
 
 おそらく開発中に最もよく使う Branch protection rules。
 
 
 284 shumon.fujita

  215. ettings について
 リポジトリ 設定を変えるタブ(それ そう) 
 
 各種機能 on/off や、

    ecrets 登録、デフォルトブランチ 変更、 マージに関するルール 設定など色々できる。 
 
 おそらく開発中に最もよく使う Branch protection rules。
 指定した正規表現にマッチした branch に対して、 を経ない直接 push や force push を禁止したり...etc 
 
 
 285 shumon.fujita

  216. ettings について
 リポジトリ 設定を変えるタブ(それ そう) 
 
 各種機能 on/off や、

    ecrets 登録、デフォルトブランチ 変更、 マージに関するルール 設定など色々できる。 
 
 おそらく開発中に最もよく使う Branch protection rules。
 指定した正規表現にマッチした branch に対して、 を経ない直接 push や force push を禁止したり...etc 
 master(main) と develop に 、大体なんらか ルールが設定されていると思う。 
 
 
 286 shumon.fujita

  217. ettings について
 リポジトリ 設定を変えるタブ(それ そう) 
 
 各種機能 on/off や、

    ecrets 登録、デフォルトブランチ 変更、 マージに関するルール 設定など色々できる。 
 
 おそらく開発中に最もよく使う Branch protection rules。
 指定した正規表現にマッチした branch に対して、 を経ない直接 push や force push を禁止したり...etc 
 master(main) と develop に 、大体なんらか ルールが設定されていると思う。 
 
 private → public 変更、オーナー権限 委譲、リポジトリ 削除など 危険な操作もある で注意 。
 287 shumon.fujita

  218. Git 内部構 
 ついにきました本日 メインです。 
 ここから 話が理解できれ Git 5

    割ぐらい 自作できます。 
 目指せ Git マスター。
 289 shumon.fujita

  219. Git 内部構 
 Git をよく使っていても、実 全然 Git ことを理解できていない 
 


    - commit って親 commit と 差分を保存してるんでしょ
 - branch って分かれた枝 ことでしょ
 - reset って commit をなかったことにするコマンドでしょ
 
 
 290 shumon.fujita

  220. Git 内部構 
 Git をよく使っていても、実 全然 Git ことを理解できていない 
 


    - commit って親 commit と 差分を保存してるんでしょ
 - branch って分かれた枝 ことでしょ
 - reset って commit をなかったことにするコマンドでしょ
 
 ↑ 全部間違い
 
 291 shumon.fujita

  221. Git 内部構 
 Git をよく使っていても、実 全然 Git ことを理解できていない 
 


    - commit って親 commit と 差分を保存してるんでしょ
 - branch って分かれた枝 ことでしょ
 - reset って commit をなかったことにするコマンドでしょ
 
 ↑ 全部間違い
 自分も学生時代 勘違いしたまま使ってた 
 
 292 shumon.fujita

  222. Git 内部構 
 Git をよく使っていても、実 全然 Git ことを理解できていない 
 


    - commit って親 commit と 差分を保存してるんでしょ
 - branch って分かれた枝 ことでしょ
 - reset って commit をなかったことにするコマンドでしょ
 
 ↑ 全部間違い
 自分も学生時代 勘違いしたまま使ってた 
 ここから 話を聞け 「reset や rebase 叩くとき 毎回検索してコピペしてる 」みたいな状況を脱せる ず 
 293 shumon.fujita

  223. 297 Git を使っていると、大きく3つ 段階を踏んで commit する 
 1. コードを編集する
 2.

    編集したコードを add する 
 3. commit する
 
 コミット 仕組み
 shumon.fujita

  224. 298 Git を使っていると、大きく3つ 段階を踏んで commit する 
 1. コードを編集する
 2.

    編集したコードを add する 
 3. commit する
 2 と 3 ときに、Git 内部で一体何が起こっている かを追っていく 
 
 コミット 仕組み
 shumon.fujita

  225. こんなリポジトリを用意して実験してみる。 
 
 $ tree . └── README.md 0 directories,

    1 file 
 ルートに EAD E.md があるだけ。 
 299 コミット 仕組み
 shumon.fujita

  226. 編集したコードを add すると、内部的に 何が起こっている か 
 → 教科書的な回答 「コミットに含めたいファイルを index

    に登録している」 
 
 具体的に index どこにあるかというと、.git/index に保存されている。 
 
 302 コミット 仕組み
 shumon.fujita

  227. 編集したコードを add すると、内部的に 何が起こっている か 
 → 教科書的な回答 「コミットに含めたいファイルを index

    に登録している」 
 
 具体的に index どこにあるかというと、.git/index に保存されている。 
 とりあえず cat してみる。
 $ cat .git/index DIRC`m�� \D�`m�� \D����_A�</�S]:7��U��W���V�9� README.mdTREE1 0 Z��� �c�ؤ�c$-�Y�T1`^:qȋ�r��g�p;��T�� 
 303 コミット 仕組み
 shumon.fujita

  228. 編集したコードを add すると、内部的に 何が起こっている か 
 → 教科書的な回答 「コミットに含めたいファイルを index

    に登録している」 
 
 具体的に index どこにあるかというと、.git/index に保存されている。 
 とりあえず cat してみる。バイナリファイルで文字化けしてるけど、それっぽい文字列が見える。 
 $ cat .git/index DIRC`m�� \D�`m�� \D����_A�</�S]:7��U��W���V�9� README.mdTREE1 0 Z��� �c�ؤ�c$-�Y�T1`^:qȋ�r��g�p;��T�� 
 304 コミット 仕組み
 shumon.fujita

  229. index 中身を確認するコマンドがある で、それで確認してみる。 
 
 $ git ls-files --stage 100644

    e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md 
 
 307 コミット 仕組み
 shumon.fujita

  230. index 中身を確認するコマンドがある で、それで確認してみる。 
 
 $ git ls-files --stage 100644

    e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md 
 
 308 コミット 仕組み
 shumon.fujita
 ファイル 種類
 +
 パーミッション

  231. index 中身を確認するコマンドがある で、それで確認してみる。 
 
 $ git ls-files --stage 100644

    e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md 
 
 309 コミット 仕組み
 shumon.fujita
 ファイル 種類
 +
 パーミッション
 blob ハッシュ(後述) 

  232. index 中身を確認するコマンドがある で、それで確認してみる。 
 
 $ git ls-files --stage 100644

    e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md 
 
 310 コミット 仕組み
 shumon.fujita
 ファイル 種類
 +
 パーミッション
 blob ハッシュ(後述) 
 コンフリクトフラグ
 (0ならコンフリクトなし)

  233. index 中身を確認するコマンドがある で、それで確認してみる。 
 
 $ git ls-files --stage 100644

    e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md 
 
 311 コミット 仕組み
 shumon.fujita
 ファイル 種類
 +
 パーミッション
 blob ハッシュ(後述) 
 コンフリクトフラグ
 (0ならコンフリクトなし)
 ファイル名

  234. index 中身を確認するコマンドがある で、それで確認してみる。 
 
 $ git ls-files --stage 100644

    e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md 
 ファイル名と一緒に何やら色んな情報が出てくる。 
 
 312 コミット 仕組み
 shumon.fujita
 ファイル 種類
 +
 パーミッション
 blob ハッシュ(後述) 
 コンフリクトフラグ
 (0ならコンフリクトなし)
 ファイル名

  235. index 中身を確認するコマンドがある で、それで確認してみる。 
 
 $ git ls-files --stage 100644

    e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md 
 ファイル名と一緒に何やら色んな情報が出てくる。 
 
 ちなみに index 、ここに表示されていない情報も持っている。 
 313 コミット 仕組み
 shumon.fujita
 ファイル 種類
 +
 パーミッション
 blob ハッシュ(後述) 
 コンフリクトフラグ
 (0ならコンフリクトなし)
 ファイル名

  236. index 中身を確認するコマンドがある で、それで確認してみる。 
 
 $ git ls-files --stage 100644

    e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md 
 ファイル名と一緒に何やら色んな情報が出てくる。 
 
 ちなみに index 、ここに表示されていない情報も持っている。 
 気になる人 --debug を付けると index が持ってる全情報を確認できる(詳しく index-format.txt 参照)
 314 コミット 仕組み
 shumon.fujita
 ファイル 種類
 +
 パーミッション
 blob ハッシュ(後述) 
 コンフリクトフラグ
 (0ならコンフリクトなし)
 ファイル名

  237. 317 blob ハッシュってなに?→ Git に管理されている オブジェクト 1 種( key) こと。


    Git に 様々なデータを、「オブジェクト」と呼 れる概念で表現している。 
 
 コミット 仕組み
 shumon.fujita

  238. 318 blob ハッシュってなに?→ Git に管理されている オブジェクト 1 種( key) こと。


    Git に 様々なデータを、「オブジェクト」と呼 れる概念で表現している。 
 オブジェクトに 以下 4 種類がある。 
 - commit オブジェクト
 - コミット 情報が入っているオブジェクト 
 - tree オブジェクト
 - ディレクトリ 情報が入っているオブジェクト 
 - blob オブジェクト
 - ファイル 情報が入っているオブジェクト 
 - tag オブジェクト
 - annotated tag 情報が入っているオブジェクト 
 
 
 コミット 仕組み
 shumon.fujita

  239. 319 blob ハッシュってなに?→ Git に管理されている オブジェクト 1 種( key) こと。


    Git に 様々なデータを、「オブジェクト」と呼 れる概念で表現している。 
 オブジェクトに 以下 4 種類がある。 
 - commit オブジェクト
 - コミット 情報が入っているオブジェクト 
 - tree オブジェクト
 - ディレクトリ 情報が入っているオブジェクト 
 - blob オブジェクト
 - ファイル 情報が入っているオブジェクト 
 - tag オブジェクト
 - annotated tag 情報が入っているオブジェクト 
 
 
 コミット 仕組み
 shumon.fujita

  240. 320 blob ハッシュってなに?→ Git に管理されている オブジェクト 1 種( key) こと。


    Git に 様々なデータを、「オブジェクト」と呼 れる概念で表現している。 
 オブジェクトに 以下 4 種類がある。 
 - commit オブジェクト
 - コミット 情報が入っているオブジェクト 
 - tree オブジェクト
 - ディレクトリ 情報が入っているオブジェクト 
 - blob オブジェクト
 - ファイル 情報が入っているオブジェクト 
 - tag オブジェクト
 - annotated tag 情報が入っているオブジェクト 
 
 
 コミット 仕組み
 shumon.fujita

  241. 321 blob ハッシュってなに?→ Git に管理されている オブジェクト 1 種( key) こと。


    Git に 様々なデータを、「オブジェクト」と呼 れる概念で表現している。 
 オブジェクトに 以下 4 種類がある。 
 - commit オブジェクト
 - コミット 情報が入っているオブジェクト 
 - tree オブジェクト
 - ディレクトリ 情報が入っているオブジェクト 
 - blob オブジェクト
 - ファイル 情報が入っているオブジェクト(バックアップ) 
 - tag オブジェクト
 - annotated tag 情報が入っているオブジェクト 
 
 
 コミット 仕組み
 shumon.fujita

  242. 322 blob ハッシュってなに?→ Git に管理されている オブジェクト 1 種( key) こと。


    Git に 様々なデータを、「オブジェクト」と呼 れる概念で表現している。 
 オブジェクトに 以下 4 種類がある。 
 - commit オブジェクト
 - コミット 情報が入っているオブジェクト 
 - tree オブジェクト
 - ディレクトリ 情報が入っているオブジェクト 
 - blob オブジェクト
 - ファイル 情報が入っているオブジェクト(バックアップ) 
 - tag オブジェクト
 - annotated tag 情報が入っているオブジェクト 
 
 
 コミット 仕組み
 shumon.fujita

  243. 323 blob ハッシュってなに?→ Git に管理されている オブジェクト 1 種( key) こと。


    Git に 様々なデータを、「オブジェクト」と呼 れる概念で表現している。 
 オブジェクトに 以下 4 種類がある。 
 - commit オブジェクト
 - コミット 情報が入っているオブジェクト 
 - tree オブジェクト
 - ディレクトリ 情報が入っているオブジェクト 
 - blob オブジェクト
 - ファイル 情報が入っているオブジェクト(バックアップ) 
 - tag オブジェクト
 - annotated tag 情報が入っているオブジェクト 
 
 ただしGit で扱うデータが全てオブジェクトなわけで ない。例え branch オブジェクトで管理していない。 
 コミット 仕組み
 shumon.fujita

  244. 325 オブジェクト 実体 .git/objects 中に zlib で圧縮して保存されている。 
 
 例え

    、key が e2022389da0c18f0c8a0e2f9b27d58d197f41b32 オブジェクト パス 、 
 .git/objects/e2/022389da0c18f0c8a0e2f9b27d58d197f41b32 になる。
 
 
 コミット 仕組み
 shumon.fujita

  245. 326 オブジェクト 実体 .git/objects 中に zlib で圧縮して保存されている。 
 
 例え

    、key が e2022389da0c18f0c8a0e2f9b27d58d197f41b32 オブジェクト パス 、 
 .git/objects/e2/022389da0c18f0c8a0e2f9b27d58d197f41b32 になる。
 
 こ ように、Git 一種 ey-Value tore としてオブジェクトを管理している。 
 
 コミット 仕組み
 shumon.fujita

  246. EAD E.md blob (e2022389da0c18f0c8a0e2f9b27d58d197f41b32) 中身を確認してみる。 
 $ cat README.md #

    21 卒 Git 研修用リポジトリ $ cat .git/objects/e2/022389da0c18f0c8a0e2f9b27d58d197f41b32 | zlib d blob 38# 21 卒 Git 研修用リポジトリ 328 コミット 仕組み

  247. EAD E.md blob (e2022389da0c18f0c8a0e2f9b27d58d197f41b32) 中身を確認してみる。 
 $ cat README.md #

    21 卒 Git 研修用リポジトリ $ cat .git/objects/e2/022389da0c18f0c8a0e2f9b27d58d197f41b32 | zlib d blob 38# 21 卒 Git 研修用リポジトリ ファイル 先頭に、オブジェクト 種類とファイルサイズを付けたも を、zlib で圧縮している事が分かる。 
 329 コミット 仕組み

  248. EAD E.md blob (e2022389da0c18f0c8a0e2f9b27d58d197f41b32) 中身を確認してみる。 
 $ cat README.md #

    21 卒 Git 研修用リポジトリ $ cat .git/objects/e2/022389da0c18f0c8a0e2f9b27d58d197f41b32 | zlib d blob 38# 21 卒 Git 研修用リポジトリ ファイル 先頭に、オブジェクト 種類とファイルサイズを付けたも を、zlib で圧縮している事が分かる。 
 blobオブジェクト ファイル 差分で なくファイル 中身そ も を記録している事も分かる。 
 330 コミット 仕組み

  249. EAD E.md blob (e2022389da0c18f0c8a0e2f9b27d58d197f41b32) 中身を確認してみる。 
 $ cat README.md #

    21 卒 Git 研修用リポジトリ $ cat .git/objects/e2/022389da0c18f0c8a0e2f9b27d58d197f41b32 | zlib d blob 38# 21 卒 Git 研修用リポジトリ ファイル 先頭に、オブジェクト 種類とファイルサイズを付けたも を、zlib で圧縮している事が分かる。 
 blobオブジェクト ファイル 差分で なくファイル 中身そ も を記録している事も分かる。 
 ちなみに、圧縮前 状態 HA-1 が、こ blob を指す key になっている。 
 $ cat .git/objects/e2/022389da0c18f0c8a0e2f9b27d58d197f41b32 | zlib d | shasum e2022389da0c18f0c8a0e2f9b27d58d197f41b32 - 331 コミット 仕組み

  250. EAD E.md blob (e2022389da0c18f0c8a0e2f9b27d58d197f41b32) 中身を確認してみる。 
 $ cat README.md #

    21 卒 Git 研修用リポジトリ $ cat .git/objects/e2/022389da0c18f0c8a0e2f9b27d58d197f41b32 | zlib d blob 38# 21 卒 Git 研修用リポジトリ ファイル 先頭に、オブジェクト 種類とファイルサイズを付けたも を、zlib で圧縮している事が分かる。 
 blobオブジェクト ファイル 差分で なくファイル 中身そ も を記録している事も分かる。 
 ちなみに、圧縮前 状態 HA-1 が、こ blob を指す key になっている。 
 $ cat .git/objects/e2/022389da0c18f0c8a0e2f9b27d58d197f41b32 | zlib d | shasum e2022389da0c18f0c8a0e2f9b27d58d197f41b32 - 332 コミット 仕組み

  251. 各オブジェクト 中身を確認するに 、自分で zlib で伸長してもいいけど、git cat-file を使え 簡単にできる。 
 $

    git cat-file -p <オブジェクトハッシュ> 
 334 コミット 仕組み
 shumon.fujita

  252. 各オブジェクト 中身を確認するに 、自分で zlib で伸長してもいいけど、git cat-file を使え 簡単にできる。 
 $

    git cat-file -p <オブジェクトハッシュ> -p オプションを付けると、自動でオブジェクト 種類を判別して読みやすく整形して表示してくれる。 
 335 コミット 仕組み
 shumon.fujita

  253. 336 各オブジェクト 中身を確認するに 、自分で zlib で伸長してもいいけど、git cat-file を使え 簡単にできる。 


    $ git cat-file -p <オブジェクトハッシュ> -p オプションを付けると、自動でオブジェクト 種類を判別して読みやすく整形して表示してくれる。 
 
 $ git cat-file -p e2022389da0c18f0c8a0e2f9b27d58d197f41b32 # 21 卒 Git 研修用リポジトリ 
 コミット 仕組み
 shumon.fujita

  254. 337 本題に戻って、編集したコードを add すると何が起こる か。 
 $ git ls-files --stage

    100644 e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md 
 コミット 仕組み
 shumon.fujita

  255. 338 本題に戻って、編集したコードを add すると何が起こる か。 
 $ git ls-files --stage

    100644 e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md $ echo hoge > hoge.txt 
 コミット 仕組み
 shumon.fujita

  256. 339 本題に戻って、編集したコードを add すると何が起こる か。 
 $ git ls-files --stage

    100644 e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md $ echo hoge > hoge.txt $ git add hoge.txt 
 コミット 仕組み
 shumon.fujita

  257. 340 本題に戻って、編集したコードを add すると何が起こる か。 
 $ git ls-files --stage

    100644 e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md $ echo hoge > hoge.txt $ git add hoge.txt $ git ls-files --stage 
 コミット 仕組み
 shumon.fujita

  258. 341 本題に戻って、編集したコードを add すると何が起こる か。 
 $ git ls-files --stage

    100644 e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md $ echo hoge > hoge.txt $ git add hoge.txt $ git ls-files --stage 100644 e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md 100644 2262de0c121f22df8e78f5a37d6e114fd322c0b0 0 hoge.txt 
 コミット 仕組み
 shumon.fujita

  259. 342 本題に戻って、編集したコードを add すると何が起こる か。 
 $ git ls-files --stage

    100644 e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md $ echo hoge > hoge.txt $ git add hoge.txt $ git ls-files --stage 100644 e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md 100644 2262de0c121f22df8e78f5a37d6e114fd322c0b0 0 hoge.txt 
 コミット 仕組み
 shumon.fujita

  260. 343 本題に戻って、編集したコードを add すると何が起こる か。 
 $ git ls-files --stage

    100644 e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md $ echo hoge > hoge.txt $ git add hoge.txt $ git ls-files --stage 100644 e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md 100644 2262de0c121f22df8e78f5a37d6e114fd322c0b0 0 hoge.txt index が更新されて、新しいエントリが追加されていることが分かる(こ とき blob も一緒に生成される) 
 コミット 仕組み
 shumon.fujita

  261. add 基本的に index 更新 + blob オブジェクト 生成しかしていない。 
 $

    mkdir fuga $ echo fuga > fuga/fuga.txt 
 344 コミット 仕組み
 shumon.fujita

  262. add 基本的に index 更新 + blob オブジェクト 生成しかしていない。 
 $

    mkdir fuga $ echo fuga > fuga/fuga.txt $ git add fuga/fuga.txt 
 345 コミット 仕組み
 shumon.fujita

  263. add 基本的に index 更新 + blob オブジェクト 生成しかしていない。 
 $

    mkdir fuga $ echo fuga > fuga/fuga.txt $ git add fuga/fuga.txt $ git ls-files --stage 
 346 コミット 仕組み
 shumon.fujita

  264. add 基本的に index 更新 + blob オブジェクト 生成しかしていない。 
 $

    mkdir fuga $ echo fuga > fuga/fuga.txt $ git add fuga/fuga.txt $ git ls-files --stage 100644 e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md 100644 9128c3eb56a3547e2cca631042366bf0f37abe67 0 fuga/fuga.txt 100644 2262de0c121f22df8e78f5a37d6e114fd322c0b0 0 hoge.txt 
 347 コミット 仕組み
 shumon.fujita

  265. add 基本的に index 更新 + blob オブジェクト 生成しかしていない。 
 $

    mkdir fuga $ echo fuga > fuga/fuga.txt $ git add fuga/fuga.txt $ git ls-files --stage 100644 e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md 100644 9128c3eb56a3547e2cca631042366bf0f37abe67 0 fuga/fuga.txt 100644 2262de0c121f22df8e78f5a37d6e114fd322c0b0 0 hoge.txt 
 348 コミット 仕組み
 shumon.fujita

  266. add 基本的に index 更新 + blob オブジェクト 生成しかしていない。 
 $

    mkdir fuga $ echo fuga > fuga/fuga.txt $ git add fuga/fuga.txt $ git ls-files --stage 100644 e2022389da0c18f0c8a0e2f9b27d58d197f41b32 0 README.md 100644 9128c3eb56a3547e2cca631042366bf0f37abe67 0 fuga/fuga.txt 100644 2262de0c121f22df8e78f5a37d6e114fd322c0b0 0 hoge.txt ディレクトリが追加されても tree オブジェクト 作らず、blob オブジェクトしか作らない。 
 349 コミット 仕組み
 shumon.fujita

  267. 351 blob オブジェクト add 時に、tree オブジェクト commit 時に生成する。 
 


    commit すると内部的に実行している処理 大まかに 次 通り。 
 1. index から tree オブジェクトを生成 
 2. commit オブジェクトを生成 
 3. HEAD を新しい commit ハッシュに書き換え 
 
 
 コミット 仕組み
 shumon.fujita

  268. 352 blob オブジェクト add 時に、tree オブジェクト commit 時に生成する。 
 


    commit すると内部的に実行している処理 大まかに 次 通り。 
 1. index から tree オブジェクトを生成 
 2. commit オブジェクトを生成 
 3. HEAD を新しい commit ハッシュに書き換え 
 
 それぞれ細かく見ていく。
 コミット 仕組み
 shumon.fujita

  269. 354 commit オブジェクトを作る前に、index から tree オブジェクトを生成する。 
 tree オブジェクト 構

    こんな感じ。 
 $ cat .git/objects/18/4135bd0b06f80372a29a35c32ba2e8a5609dc6 | zlib d | hexdump -C 00000000 74 72 65 65 20 33 37 00 31 30 30 36 34 34 20 52 |tree 37.100644 R| 00000010 45 41 44 4d 45 2e 6d 64 00 e2 02 23 89 da 0c 18 |EADME.md...#....| 00000020 f0 c8 a0 e2 f9 b2 7d 58 d1 97 f4 1b 32 |......}X....2| 
 コミット 仕組み
 shumon.fujita

  270. 355 commit オブジェクトを作る前に、index から tree オブジェクトを生成する。 
 tree オブジェクト 構

    こんな感じ。 
 $ cat .git/objects/18/4135bd0b06f80372a29a35c32ba2e8a5609dc6 | zlib d | hexdump -C 00000000 74 72 65 65 20 33 37 00 31 30 30 36 34 34 20 52 |tree 37.100644 R| 00000010 45 41 44 4d 45 2e 6d 64 00 e2 02 23 89 da 0c 18 |EADME.md...#....| 00000020 f0 c8 a0 e2 f9 b2 7d 58 d1 97 f4 1b 32 |......}X....2| 
 コミット 仕組み
 shumon.fujita

  271. 356 commit オブジェクトを作る前に、index から tree オブジェクトを生成する。 
 tree オブジェクト 構

    こんな感じ。 
 $ cat .git/objects/18/4135bd0b06f80372a29a35c32ba2e8a5609dc6 | zlib d | hexdump -C 00000000 74 72 65 65 20 33 37 00 31 30 30 36 34 34 20 52 |tree 37.100644 R| 00000010 45 41 44 4d 45 2e 6d 64 00 e2 02 23 89 da 0c 18 |EADME.md...#....| 00000020 f0 c8 a0 e2 f9 b2 7d 58 d1 97 f4 1b 32 |......}X....2| 
 コミット 仕組み
 shumon.fujita

  272. 357 commit オブジェクトを作る前に、index から tree オブジェクトを生成する。 
 tree オブジェクト 構

    こんな感じ。 
 $ cat .git/objects/18/4135bd0b06f80372a29a35c32ba2e8a5609dc6 | zlib d | hexdump -C 00000000 74 72 65 65 20 33 37 00 31 30 30 36 34 34 20 52 |tree 37.100644 R| 00000010 45 41 44 4d 45 2e 6d 64 00 e2 02 23 89 da 0c 18 |EADME.md...#....| 00000020 f0 c8 a0 e2 f9 b2 7d 58 d1 97 f4 1b 32 |......}X....2| 
 コミット 仕組み
 shumon.fujita

  273. 358 commit オブジェクトを作る前に、index から tree オブジェクトを生成する。 
 tree オブジェクト 構

    こんな感じ。 
 $ cat .git/objects/18/4135bd0b06f80372a29a35c32ba2e8a5609dc6 | zlib d | hexdump -C 00000000 74 72 65 65 20 33 37 00 31 30 30 36 34 34 20 52 |tree 37.100644 R| 00000010 45 41 44 4d 45 2e 6d 64 00 e2 02 23 89 da 0c 18 |EADME.md...#....| 00000020 f0 c8 a0 e2 f9 b2 7d 58 d1 97 f4 1b 32 |......}X....2| 
 コミット 仕組み
 shumon.fujita

  274. 359 commit オブジェクトを作る前に、index から tree オブジェクトを生成する。 
 tree オブジェクト 構

    こんな感じ。 
 $ cat .git/objects/18/4135bd0b06f80372a29a35c32ba2e8a5609dc6 | zlib d | hexdump -C 00000000 74 72 65 65 20 33 37 00 31 30 30 36 34 34 20 52 |tree 37.100644 R| 00000010 45 41 44 4d 45 2e 6d 64 00 e2 02 23 89 da 0c 18 |EADME.md...#....| 00000020 f0 c8 a0 e2 f9 b2 7d 58 d1 97 f4 1b 32 |......}X....2| ファイル 種類とパーミッション フラグとファイル名、blob ハッシュが 0x00 区切りで書き込まれている。 
 
 コミット 仕組み
 shumon.fujita

  275. 360 commit オブジェクトを作る前に、index から tree オブジェクトを生成する。 
 tree オブジェクト 構

    こんな感じ。 
 $ cat .git/objects/18/4135bd0b06f80372a29a35c32ba2e8a5609dc6 | zlib d | hexdump -C 00000000 74 72 65 65 20 33 37 00 31 30 30 36 34 34 20 52 |tree 37.100644 R| 00000010 45 41 44 4d 45 2e 6d 64 00 e2 02 23 89 da 0c 18 |EADME.md...#....| 00000020 f0 c8 a0 e2 f9 b2 7d 58 d1 97 f4 1b 32 |......}X....2| ファイル 種類とパーミッション フラグとファイル名、blob ハッシュが 0x00 区切りで書き込まれている。 
 → 全部 index が持っていた情報 
 
 コミット 仕組み
 shumon.fujita

  276. 361 commit オブジェクトを作る前に、index から tree オブジェクトを生成する。 
 tree オブジェクト 構

    こんな感じ。 
 $ cat .git/objects/18/4135bd0b06f80372a29a35c32ba2e8a5609dc6 | zlib d | hexdump -C 00000000 74 72 65 65 20 33 37 00 31 30 30 36 34 34 20 52 |tree 37.100644 R| 00000010 45 41 44 4d 45 2e 6d 64 00 e2 02 23 89 da 0c 18 |EADME.md...#....| 00000020 f0 c8 a0 e2 f9 b2 7d 58 d1 97 f4 1b 32 |......}X....2| ファイル 種類とパーミッション フラグとファイル名、blob ハッシュが 0x00 区切りで書き込まれている。 
 → 全部 index が持っていた情報 
 
 コミット 仕組み

  277. 363 ちなみに tree オブジェクトも cat-file で確認できる。 
 
 
 $

    git cat-file -p 184135 100644 blob e2022389da0c18f0c8a0e2f9b27d58d197f41b32 README.md 
 
 コミット 仕組み
 shumon.fujita

  278. 364 ちなみに tree オブジェクトも cat-file で確認できる。 
 16進数でダンプするよりも、もっと人間にやさしく表示してくれる。 
 


    $ git cat-file -p 184135 100644 blob e2022389da0c18f0c8a0e2f9b27d58d197f41b32 README.md 
 
 コミット 仕組み
 shumon.fujita

  279. 365 ちなみに tree オブジェクトも cat-file で確認できる。 
 16進数でダンプするよりも、もっと人間にやさしく表示してくれる。 
 


    $ git cat-file -p 184135 100644 blob e2022389da0c18f0c8a0e2f9b27d58d197f41b32 README.md コミット 仕組み
 shumon.fujita

  280. 367 commit すると差分だけでなく、 リポジトリ ルートディレクトリを含む全ディレクトリ分 tree を自動で作る 。
 こ 時、変更があった部分だけ新しい

    blob 及 tree オブジェクト 
 に書き換えられ、それ以外 コピーされる。 
 
 コミット 仕組み
 https://git-scm.com/book/en/v2/Git-Internals-Git- bjects

  281. 368 commit すると差分だけでなく、 リポジトリ ルートディレクトリを含む全ディレクトリ分 tree を自動で作る 。
 こ 時、変更があった部分だけ新しい

    blob 及 tree オブジェクト 
 に書き換えられ、それ以外 コピーされる。 
 tree オブジェクトを作ったら、次 後述する 
 commit オブジェクトを作る。 
 
 コミット 仕組み
 https://git-scm.com/book/en/v2/Git-Internals-Git- bjects

  282. 369 commit すると差分だけでなく、 リポジトリ ルートディレクトリを含む全ディレクトリ分 tree を自動で作る 。
 こ 時、変更があった部分だけ新しい

    blob 及 tree オブジェクト 
 に書き換えられ、それ以外 コピーされる。 
 tree オブジェクトを作ったら、次 後述する 
 commit オブジェクトを作る。 
 commit オブジェクト 、リポジトリ ルートにあたる 
 tree オブジェクトを参照していて、commit 時 リポジトリ 
 状態を再現できるようになっている。 
 
 
 コミット 仕組み
 https://git-scm.com/book/en/v2/Git-Internals-Git- bjects

  283. 370 commit すると差分だけでなく、 リポジトリ ルートディレクトリを含む全ディレクトリ分 tree を自動で作る 。
 こ 時、変更があった部分だけ新しい

    blob 及 tree オブジェクト 
 に書き換えられ、それ以外 コピーされる。 
 tree オブジェクトを作ったら、次 後述する 
 commit オブジェクトを作る。 
 commit オブジェクト 、リポジトリ ルートにあたる 
 tree オブジェクトを参照していて、commit 時 リポジトリ 
 状態を再現できるようになっている。 
 => コミット ある時点 スナップショット 
 
 
 
 コミット 仕組み
 https://git-scm.com/book/en/v2/Git-Internals-Git- bjects

  284. 371 commit すると差分だけでなく、 リポジトリ ルートディレクトリを含む全ディレクトリ分 tree を自動で作る 。
 こ 時、変更があった部分だけ新しい

    blob 及 tree オブジェクト 
 に書き換えられ、それ以外 コピーされる。 
 tree オブジェクトを作ったら、次 後述する 
 commit オブジェクトを作る。 
 commit オブジェクト 、リポジトリ ルートにあたる 
 tree オブジェクトを参照していて、commit 時 リポジトリ 
 状態を再現できるようになっている。 
 => コミット ある時点 スナップショット 
 checkoutなどで別 コミットに移った時にすぐにそ 状態を 
 復元できる これが理由。 
 
 
 コミット 仕組み
 https://git-scm.com/book/en/v2/Git-Internals-Git- bjects

  285. 372 commit オブジェクト 構 こんな感じ。 
 
 $ cat .git/objects/56/4d5425c6eff4fab2be1cec9562003b6b64eea0

    | zlib d commit 232tree 184135bd0b06f80372a29a35c32ba2e8a5609dc6 parent dd08f09944c8c97a718548030886514d8ef4b887 author shumon84 <[email protected]> 1617805187 +0900 committer shumon84 <[email protected]> 1617805187 +0900 README.md を追加
 コミット 仕組み
 shumon.fujita

  286. 373 commit オブジェクト 構 こんな感じ。 
 他 オブジェクトと同様に、これ HA-1 ハッシュが

    commit ハッシュになる。 
 $ cat .git/objects/56/4d5425c6eff4fab2be1cec9562003b6b64eea0 | zlib d commit 232tree 184135bd0b06f80372a29a35c32ba2e8a5609dc6 parent dd08f09944c8c97a718548030886514d8ef4b887 author shumon84 <[email protected]> 1617805187 +0900 committer shumon84 <[email protected]> 1617805187 +0900 README.md を追加
 コミット 仕組み
 shumon.fujita

  287. 374 commit オブジェクト 構 こんな感じ。 
 他 オブジェクトと同様に、これ HA-1 ハッシュが

    commit ハッシュになる。 
 $ cat .git/objects/56/4d5425c6eff4fab2be1cec9562003b6b64eea0 | zlib d commit 232tree 184135bd0b06f80372a29a35c32ba2e8a5609dc6 parent dd08f09944c8c97a718548030886514d8ef4b887 author shumon84 <[email protected]> 1617805187 +0900 committer shumon84 <[email protected]> 1617805187 +0900 README.md を追加
 コミット 仕組み
 shumon.fujita

  288. 375 commit オブジェクト 構 こんな感じ。 
 他 オブジェクトと同様に、これ HA-1 ハッシュが

    commit ハッシュになる。 
 $ cat .git/objects/56/4d5425c6eff4fab2be1cec9562003b6b64eea0 | zlib d commit 232tree 184135bd0b06f80372a29a35c32ba2e8a5609dc6 parent dd08f09944c8c97a718548030886514d8ef4b887 author shumon84 <[email protected]> 1617805187 +0900 committer shumon84 <[email protected]> 1617805187 +0900 README.md を追加
 コミット 仕組み
 shumon.fujita

  289. 376 commit オブジェクト 構 こんな感じ。 
 他 オブジェクトと同様に、これ HA-1 ハッシュが

    commit ハッシュになる。 
 $ cat .git/objects/56/4d5425c6eff4fab2be1cec9562003b6b64eea0 | zlib d commit 232tree 184135bd0b06f80372a29a35c32ba2e8a5609dc6 parent dd08f09944c8c97a718548030886514d8ef4b887 author shumon84 <[email protected]> 1617805187 +0900 committer shumon84 <[email protected]> 1617805187 +0900 README.md を追加
 コミット 仕組み
 shumon.fujita

  290. 377 commit オブジェクト 構 こんな感じ。 
 他 オブジェクトと同様に、これ HA-1 ハッシュが

    commit ハッシュになる。 
 $ cat .git/objects/56/4d5425c6eff4fab2be1cec9562003b6b64eea0 | zlib d commit 232tree 184135bd0b06f80372a29a35c32ba2e8a5609dc6 parent dd08f09944c8c97a718548030886514d8ef4b887 author shumon84 <[email protected]> 1617805187 +0900 committer shumon84 <[email protected]> 1617805187 +0900 README.md を追加
 コミット 仕組み
 shumon.fujita

  291. 378 commit オブジェクト 構 こんな感じ。 
 他 オブジェクトと同様に、これ HA-1 ハッシュが

    commit ハッシュになる。 
 $ cat .git/objects/56/4d5425c6eff4fab2be1cec9562003b6b64eea0 | zlib d commit 232tree 184135bd0b06f80372a29a35c32ba2e8a5609dc6 parent dd08f09944c8c97a718548030886514d8ef4b887 author shumon84 <[email protected]> 1617805187 +0900 committer shumon84 <[email protected]> 1617805187 +0900 README.md を追加
 コミット 仕組み
 shumon.fujita

  292. 379 commit オブジェクト 構 こんな感じ。 
 他 オブジェクトと同様に、これ HA-1 ハッシュが

    commit ハッシュになる。 
 $ cat .git/objects/56/4d5425c6eff4fab2be1cec9562003b6b64eea0 | zlib d commit 232tree 184135bd0b06f80372a29a35c32ba2e8a5609dc6 parent dd08f09944c8c97a718548030886514d8ef4b887 author shumon84 <[email protected]> 1617805187 +0900 committer shumon84 <[email protected]> 1617805187 +0900 README.md を追加
 コミット 仕組み
 shumon.fujita

  293. 380 commit オブジェクトに含まれている情報 ↓ 通り。 
 - リポジトリ ルートディレクトリ tree

    ハッシュ 
 - 親 commit ハッシュ
 - committer と author タイムスタンプ・名前・メアド 
 - コミットメッセージ
 
 
 コミット 仕組み
 shumon.fujita

  294. 381 commit オブジェクトに含まれている情報 ↓ 通り。 
 - リポジトリ ルートディレクトリ tree

    ハッシュ 
 - 親 commit ハッシュ
 - committer と author タイムスタンプ・名前・メアド 
 - コミットメッセージ
 こ うち、どれか 1 つでも変わると、( HA-1 が衝突しない限り)別 commit ハッシュ になる。 
 
 
 コミット 仕組み
 shumon.fujita

  295. 382 commit オブジェクトに含まれている情報 ↓ 通り。 
 - リポジトリ ルートディレクトリ tree

    ハッシュ 
 - 親 commit ハッシュ
 - committer と author タイムスタンプ・名前・メアド 
 - コミットメッセージ
 こ うち、どれか 1 つでも変わると、( HA-1 が衝突しない限り)別 commit ハッシュ になる。 
 
 ちなみに、commit ハッシュがどれくらい衝突しない かというと、 
 「1000 人で 1 日 10 回、40 京年間 commit し続けても、衝突する可能性 50 %」 
 と言われている。
 
 コミット 仕組み
 shumon.fujita

  296. 383 commit オブジェクトに含まれている情報 ↓ 通り。 
 - リポジトリ ルートディレクトリ tree

    ハッシュ 
 - 親 commit ハッシュ
 - committer と author タイムスタンプ・名前・メアド 
 - コミットメッセージ
 こ うち、どれか 1 つでも変わると、( HA-1 が衝突しない限り)別 commit ハッシュ になる。 
 
 ちなみに、commit ハッシュがどれくらい衝突しない かというと、 
 「1000 人で 1 日 10 回、40 京年間 commit し続けても、衝突する可能性 50 %」 
 と言われている。
 
 コミット 仕組み
 shumon.fujita
 親 commit ハッシュを
 持っていることが超重要

  297. 385 親 commit ハッシュを commit オブジェクト 一部に含めることで、改ざんされていないことが保証できる。 
 
 


    
 
 
 
 
 コミット 仕組み
 コミット1
 コミット2
 コミット3
 コミット4
 shumon.fujita

  298. 386 親 commit ハッシュを commit オブジェクト 一部に含めることで、改ざんされていないことが保証できる。 
 
 


    
 
 
 
 
 コミット 仕組み
 コミット1
 コミット2
 コミット3
 コミット4
 こ コミットを
 改ざんしたい!
 shumon.fujita

  299. 387 親 commit ハッシュを commit オブジェクト 一部に含めることで、改ざんされていないことが保証できる。 
 
 


    
 
 
 
 
 コミット 仕組み
 コミット1
 コミット2
 コミット3
 コミット4
 こ コミットを
 改ざんしたい!
 親コミット ハッシュが変わる で
 parent を書き換える必要がある
 shumon.fujita

  300. 388 親 commit ハッシュを commit オブジェクト 一部に含めることで、改ざんされていないことが保証できる。 
 
 


    
 
 
 
 
 コミット 仕組み
 コミット1
 コミット2
 コミット3
 コミット4
 こ コミットを
 改ざんしたい!
 親コミット ハッシュが変わる で
 parent を書き換える必要がある
 親コミット ハッシュが変わる で
 以下略
 shumon.fujita

  301. 389 親 commit ハッシュを commit オブジェクト 一部に含めることで、改ざんされていないことが保証できる。 
 
 


    
 
 
 
 
 コミット 仕組み
 コミット1
 コミット2
 コミット3
 コミット4
 こ コミットを
 改ざんしたい!
 親コミット ハッシュが変わる で
 parent を書き換える必要がある
 親コミット ハッシュが変わる で
 以下略
 結局元 コミット4と 
 別物になってしまう
 → 改ざん不可能
 shumon.fujita

  302. 390 親 commit ハッシュを commit オブジェクト 一部に含めることで、改ざんされていないことが保証できる。 
 
 


    
 
 
 過去 commit を改ざんするに 、それ以降全て commit を改ざんする必要があり、最新 commit も別物に。 
 
 
 コミット 仕組み
 コミット1
 コミット2
 コミット3
 コミット4
 こ コミットを
 改ざんしたい!
 親コミット ハッシュが変わる で
 parent を書き換える必要がある
 親コミット ハッシュが変わる で
 以下略
 結局元 コミット4と 
 別物になってしまう
 → 改ざん不可能
 shumon.fujita

  303. 391 親 commit ハッシュを commit オブジェクト 一部に含めることで、改ざんされていないことが保証できる。 
 
 


    
 
 
 過去 commit を改ざんするに 、それ以降全て commit を改ざんする必要があり、最新 commit も別物に。 
 → Git ブロックチェーン!! 
 コミット 仕組み
 コミット1
 コミット2
 コミット3
 コミット4
 こ コミットを
 改ざんしたい!
 親コミット ハッシュが変わる で
 parent を書き換える必要がある
 親コミット ハッシュが変わる で
 以下略
 結局元 コミット4と 
 別物になってしまう
 → 改ざん不可能
 shumon.fujita

  304. 392 blob オブジェクト add 時に、tree オブジェクト commit 時に生成する。 
 


    commit すると内部的に実行している処理 大まかに 次 通り。 (本当 もうちょっと色々やってるけど割愛)
 1. index から tree オブジェクトを生成 
 2. commit オブジェクトを生成 
 3. HEAD を新しい commit ハッシュに書き換え 
 
 それぞれ細かく見ていく。
 コミット 仕組み
 shumon.fujita

  305. 395 commit オブジェクトを作ったら、Git 最後に HEAD を書き換える。 
 → HEAD と

    ?
 
 HEAD 話をする前に、refs 話をする必要がある。(HEAD refs 一種) 
 
 コミット 仕組み
 shumon.fujita

  306. 396 commit オブジェクトを作ったら、Git 最後に HEAD を書き換える。 
 → HEAD と

    ?
 
 HEAD 話をする前に、refs 話をする必要がある。(HEAD refs 一種) 
 refs 特定 commit を指すポインタ ようなも 。commit ハッシュ エイリアスとも言える。 
 
 コミット 仕組み
 shumon.fujita

  307. 397 commit オブジェクトを作ったら、Git 最後に HEAD を書き換える。 
 → HEAD と

    ?
 
 HEAD 話をする前に、refs 話をする必要がある。(HEAD refs 一種) 
 refs 特定 commit を指すポインタ ようなも 。commit ハッシュ エイリアスとも言える。 
 具体的に ↓などが refs にあたる。 
 - tag
 - branch
 - HEAD
 コミット 仕組み
 shumon.fujita

  308. 399 まず refs 中でも、最も単純な light weight tag を見ていく。 
 light

    weight tag 本当にただ特定 commit を指しているだけ。 
 refs について
 shumon.fujita

  309. 400 まず refs 中でも、最も単純な light weight tag を見ていく。 
 light

    weight tag 本当にただ特定 commit を指しているだけ。 
 
 $ git tag light-weight # オプションなしでタグを作ると light weight tag になる refs について
 shumon.fujita

  310. 401 まず refs 中でも、最も単純な light weight tag を見ていく。 
 light

    weight tag 本当にただ特定 commit を指しているだけ。 
 
 $ git tag light-weight # オプションなしでタグを作ると light weight tag になる $ git log -n 1 --oneline 7c4c08d (HEAD -> master, tag: light-weight) Merge branch 'develop' refs について
 shumon.fujita

  311. 402 まず refs 中でも、最も単純な light weight tag を見ていく。 
 light

    weight tag 本当にただ特定 commit を指しているだけ。 
 タグを作ると .git/refs/tags/ 以下に保存される。 
 $ git tag light-weight # オプションなしでタグを作ると light weight tag になる $ git log -n 1 --oneline 7c4c08d (HEAD -> master, tag: light-weight) Merge branch 'develop' refs について
 shumon.fujita

  312. 403 まず refs 中でも、最も単純な light weight tag を見ていく。 
 light

    weight tag 本当にただ特定 commit を指しているだけ。 
 タグを作ると .git/refs/tags/ 以下に保存される。 
 $ git tag light-weight # オプションなしでタグを作ると light weight tag になる $ git log -n 1 --oneline 7c4c08d (HEAD -> master, tag: light-weight) Merge branch 'develop' $ cat .git/refs/tags/light-weight 7c4c08d68be5a53406af4582a961a460b0db83cd refs について
 shumon.fujita

  313. 405 次に annotated tag 挙動を見ていく。 
 annotated tag と コメントが付けられるタグ

    こと。 
 -a オプションで作ることができる。 
 refs について
 shumon.fujita

  314. 406 次に annotated tag 挙動を見ていく。 
 annotated tag と コメントが付けられるタグ

    こと。 
 -a オプションで作ることができる。 $ git tag -a annotated -m "メッセージ" $ git log -n 1 --oneline 7c4c08d (HEAD -> master, tag: annotated) Merge branch 'develop' 
 refs について
 shumon.fujita

  315. 407 次に annotated tag 挙動を見ていく。 
 annotated tag と コメントが付けられるタグ

    こと。 
 -a オプションで作ることができる。 $ git tag -a annotated -m "メッセージ" $ git log -n 1 --oneline 7c4c08d (HEAD -> master, tag: annotated) Merge branch 'develop' $ cat .git/refs/tags/annotated e0114d0446b25c2c653fa5dd28c678602033c48b 
 refs について
 shumon.fujita

  316. 408 次に annotated tag 挙動を見ていく。 
 annotated tag と コメントが付けられるタグ

    こと。 
 -a オプションで作ることができる。 $ git tag -a annotated -m "メッセージ" $ git log -n 1 --oneline 7c4c08d (HEAD -> master, tag: annotated) Merge branch 'develop' $ cat .git/refs/tags/annotated e0114d0446b25c2c653fa5dd28c678602033c48b light weight tag と違って、直接 commit ハッシュが書かれているわけで ない。 
 
 refs について
 shumon.fujita

  317. 409 次に annotated tag 挙動を見ていく。 
 annotated tag と コメントが付けられるタグ

    こと。 
 -a オプションで作ることができる。 $ git tag -a annotated -m "メッセージ" $ git log -n 1 --oneline 7c4c08d (HEAD -> master, tag: annotated) Merge branch 'develop' $ cat .git/refs/tags/annotated e0114d0446b25c2c653fa5dd28c678602033c48b light weight tag と違って、直接 commit ハッシュが書かれているわけで ない。 
 → じゃあ何な ?
 refs について
 shumon.fujita

  318. 410 blob ハッシュってなに?→ Git に管理されている オブジェクト 1 種( key) こと。

    
 Git に 様々なデータを、「オブジェクト」と呼 れる概念で表現している。 
 オブジェクトに 以下 4 種類がある。 
 - commit オブジェクト
 - コミット 情報が入っているオブジェクト 
 - tree オブジェクト
 - ディレクトリ 情報が入っているオブジェクト 
 - blob オブジェクト
 - ファイル 情報が入っているオブジェクト 
 - tag オブジェクト
 - annotated tag 情報が入っているオブジェクト 
 
 ただしGit で扱うデータが全てオブジェクトなわけで ない。例え branch オブジェクトで管理していない。 
 コミット 仕組み
 shumon.fujita

  319. 411 オブジェクトな で、例によって cat-file で覗いてみる。 
 もちろん実体 .git/objects/ 以下に zlib

    で圧縮して保存されている。 
 
 refs について
 shumon.fujita

  320. 412 オブジェクトな で、例によって cat-file で覗いてみる。 
 もちろん実体 .git/objects/ 以下に zlib

    で圧縮して保存されている。 
 $ git cat-file -p e0114d0446b25c2c653fa5dd28c678602033c48b object 7c4c08d68be5a53406af4582a961a460b0db83cd type commit tag annotated tagger shumon84 <[email protected]> 1618330965 +0900 メッセージ 
 refs について
 shumon.fujita

  321. 413 オブジェクトな で、例によって cat-file で覗いてみる。 
 もちろん実体 .git/objects/ 以下に zlib

    で圧縮して保存されている。 
 $ git cat-file -p e0114d0446b25c2c653fa5dd28c678602033c48b object 7c4c08d68be5a53406af4582a961a460b0db83cd type commit tag annotated tagger shumon84 <[email protected]> 1618330965 +0900 メッセージ 
 refs について
 shumon.fujita
 object 欄に、tag が指している
 commit ハッシュが書かれている

  322. 414 オブジェクトな で、例によって cat-file で覗いてみる。 
 もちろん実体 .git/objects/ 以下に zlib

    で圧縮して保存されている。 
 $ git cat-file -p e0114d0446b25c2c653fa5dd28c678602033c48b object 7c4c08d68be5a53406af4582a961a460b0db83cd type commit tag annotated tagger shumon84 <[email protected]> 1618330965 +0900 メッセージ commit オブジェクトにちょっと似てる。 
 refs について
 shumon.fujita
 object 欄に、tag が指している
 commit ハッシュが書かれている

  323. 417 次に branch 解説。
 branch 基本的に light-weight tag とほぼ変わらない。 


    $ cat .git/refs/heads/master 7c4c08d68be5a53406af4582a961a460b0db83cd
 
 refs について
 shumon.fujita

  324. 418 次に branch 解説。
 branch 基本的に light-weight tag とほぼ変わらない。 


    $ cat .git/refs/heads/master 7c4c08d68be5a53406af4582a961a460b0db83cd
 保存場所が .git/refs/heads/ 以下になっているだけで、書かれている内容 同じ。 
 
 refs について
 shumon.fujita

  325. 419 次に branch 解説。
 branch 基本的に light-weight tag とほぼ変わらない。 


    $ cat .git/refs/heads/master 7c4c08d68be5a53406af4582a961a460b0db83cd
 保存場所が .git/refs/heads/ 以下になっているだけで、書かれている内容 同じ。 
 指している commit ハッシュが直接書かれているだけ。 
 
 refs について
 shumon.fujita

  326. 420 次に branch 解説。
 branch 基本的に light-weight tag とほぼ変わらない。 


    $ cat .git/refs/heads/master 7c4c08d68be5a53406af4582a961a460b0db83cd
 保存場所が .git/refs/heads/ 以下になっているだけで、書かれている内容 同じ。 
 指している commit ハッシュが直接書かれているだけ。 
 → tag と 違い 、tag 基本的に書き換えない に対して、branch どんどん書き換わっていくところ 
 
 refs について
 shumon.fujita

  327. 421 次に branch 解説。
 branch 基本的に light-weight tag とほぼ変わらない。 


    $ cat .git/refs/heads/master 7c4c08d68be5a53406af4582a961a460b0db83cd
 保存場所が .git/refs/heads/ 以下になっているだけで、書かれている内容 同じ。 
 指している commit ハッシュが直接書かれているだけ。 
 → tag と 違い 、tag 基本的に書き換えない に対して、branch どんどん書き換わっていくところ 
 ちなみに、branch 名がそ ままファイルパスになるため、「feature/hoge」という branch を作ると、 
 feature/ というディレクトリが作られてしまうため、それ以降「feature」という branch 作れなくなる。 
 refs について
 shumon.fujita

  328. 424 話を戻して、HEAD について。HEAD 現在 commit を指す refs。 
 checkout したとき

    HEAD が書き換わっている。 
 
 refs について
 shumon.fujita

  329. 425 話を戻して、HEAD について。HEAD 現在 commit を指す refs。 
 checkout したとき

    HEAD が書き換わっている。 
 .git/HEAD に保存されている。 
 refs について
 shumon.fujita

  330. 426 話を戻して、HEAD について。HEAD 現在 commit を指す refs。 
 checkout したとき

    HEAD が書き換わっている。 
 .git/HEAD に保存されている。 
 $ cat .git/HEAD ref: refs/heads/master 
 refs について
 shumon.fujita

  331. 427 話を戻して、HEAD について。HEAD 現在 commit を指す refs。 
 checkout したとき

    HEAD が書き換わっている。 
 .git/HEAD に保存されている。 
 $ cat .git/HEAD ref: refs/heads/master branch 名で checkout すると、commit ハッシュで なく、branch 場所が書き込まれる。 
 refs について
 shumon.fujita

  332. 428 話を戻して、HEAD について。HEAD 現在 commit を指す refs。 
 checkout したとき

    HEAD が書き換わっている。 
 .git/HEAD に保存されている。 
 $ cat .git/HEAD ref: refs/heads/master $ cat .git/refs/heads/master 7c4c08d68be5a53406af4582a961a460b0db83cd branch 名で checkout すると、commit ハッシュで なく、branch 場所が書き込まれる。 
 
 refs について
 shumon.fujita

  333. 429 話を戻して、HEAD について。HEAD 現在 commit を指す refs。 
 checkout したとき

    HEAD が書き換わっている。 
 .git/HEAD に保存されている。 
 $ cat .git/HEAD ref: refs/heads/master $ cat .git/refs/heads/master 7c4c08d68be5a53406af4582a961a460b0db83cd branch 名で checkout すると、commit ハッシュで なく、branch 場所が書き込まれる。 
 参照を辿って、現在 commit 推移的に解決される。 
 refs について
 shumon.fujita

  334. 432 ようやく commit 内部処理 話に戻ります。 
 commit オブジェクトを作ったら、Git 最後に HEAD

    を書き換える。 
 
 HEAD が直接 commit ハッシュを参照している場合 
 
 
 HEAD が branch を参照している場合 
 
 コミット 仕組み
 shumon.fujita

  335. 433 ようやく commit 内部処理 話に戻ります。 
 commit オブジェクトを作ったら、Git 最後に HEAD

    を書き換える。 
 
 HEAD が直接 commit ハッシュを参照している場合 
 → HEAD commit ハッシュを書き換える 
 
 HEAD が branch を参照している場合 
 
 コミット 仕組み
 shumon.fujita

  336. 434 ようやく commit 内部処理 話に戻ります。 
 commit オブジェクトを作ったら、Git 最後に HEAD

    を書き換える。 
 
 HEAD が直接 commit ハッシュを参照している場合 
 → HEAD commit ハッシュを書き換える 
 
 HEAD が branch を参照している場合 
 → HEAD が参照している branch commit ハッシュを書き換える 
 コミット 仕組み
 shumon.fujita

  337. 437 Git で 、1回コミットするまでに次 ような処理をしている。 
 
 1. コードを編集する
 2.

    編集したコードを add する 
 - index 更新
 - blob オブジェクト 生成
 
 
 コミット 仕組み まとめ
 shumon.fujita

  338. 438 Git で 、1回コミットするまでに次 ような処理をしている。 
 
 1. コードを編集する
 2.

    編集したコードを add する 
 - index 更新
 - blob オブジェクト 生成
 3. commit する
 - tree オブジェクト 生成
 - commit オブジェクト 生成 
 - HEAD 書き換え
 
 
 コミット 仕組み まとめ
 shumon.fujita

  339. 439 Git で 、1回コミットするまでに次 ような処理をしている。 
 
 1. コードを編集する
 2.

    編集したコードを add する 
 - index 更新
 - blob オブジェクト 生成
 3. commit する
 - tree オブジェクト 生成
 - commit オブジェクト 生成 
 - HEAD 書き換え
 
 もうちょっと色々やってるけど、大まかに 「コミットする」というとこんな感じ 処理 ことを指す。 
 コミット 仕組み まとめ
 shumon.fujita

  340. 443 すでに講義中に何度も登場している、みんなお馴染み checkout。 
 checkout に比べると、複雑で上級者向け コマンドと思われている reset。 
 実

    、こ 2 つ コマンド 結構似たようなことをしている。 
 
 
 checkout, reset 仕組み
 shumon.fujita

  341. 444 すでに講義中に何度も登場している、みんなお馴染み checkout。 
 checkout に比べると、複雑で上級者向け コマンドと思われている reset。 
 実

    、こ 2 つ コマンド 結構似たようなことをしている。 
 
 こ 2 つ 、基本的に↓ 3 つを書き換えるコマンド。 
 - ワークツリー(作業ディレクトリ) 
 - index
 - HEAD
 
 checkout, reset 仕組み
 shumon.fujita

  342. 445 すでに講義中に何度も登場している、みんなお馴染み checkout。 
 checkout に比べると、複雑で上級者向け コマンドと思われている reset。 
 実

    、こ 2 つ コマンド 結構似たようなことをしている。 
 
 こ 2 つ 、基本的に↓ 3 つを書き換えるコマンド。 
 - ワークツリー(作業ディレクトリ) 
 - index
 - HEAD
 それぞれ見ていく。
 checkout, reset 仕組み
 shumon.fujita

  343. 447 まず checkout 、指定した commit にワークツリーも index も HEAD も全部向けるコマンド。

    
 
 1. 指定した commit が参照している tree をワークツリーに展開する。 
 
 
 checkout 仕組み
 shumon.fujita

  344. 448 まず checkout 、指定した commit にワークツリーも index も HEAD も全部向けるコマンド。

    
 
 1. 指定した commit が参照している tree をワークツリーに展開する。 
 2. index をワークツリーと同期する(= tree と同じ状態にする)。 
 
 
 checkout 仕組み
 shumon.fujita

  345. 449 まず checkout 、指定した commit にワークツリーも index も HEAD も全部向けるコマンド。

    
 
 1. 指定した commit が参照している tree をワークツリーに展開する。 
 2. index をワークツリーと同期する(= tree と同じ状態にする)。 
 3. HEAD を指定した commit に変更する。 
 
 
 checkout 仕組み
 shumon.fujita

  346. 450 まず checkout 、指定した commit にワークツリーも index も HEAD も全部向けるコマンド。

    
 
 1. 指定した commit が参照している tree をワークツリーに展開する。 
 2. index をワークツリーと同期する(= tree と同じ状態にする)。 
 3. HEAD を指定した commit に変更する。 
 
 refs を指定していた場合、HEAD に そ 参照が書き込まれる。 
 checkout 仕組み
 shumon.fujita

  347. 452 reset 、オプションによって挙動が変わる。 
 おおまかに soft, mixed, hard 3 種類

    オプションがある。 
 
 
 
 
 
 reset 仕組み
 shumon.fujita

  348. 453 reset 、オプションによって挙動が変わる。 
 おおまかに soft, mixed, hard 3 種類

    オプションがある。 
 指定した commit ハッシュに向けて、それぞれ 内容を書き換える。 
 
 
 
 
 
 reset 仕組み
 shumon.fujita

  349. 454 reset 、オプションによって挙動が変わる。 
 おおまかに soft, mixed, hard 3 種類

    オプションがある。 
 指定した commit ハッシュに向けて、それぞれ 内容を書き換える。 
 
 
 
 
 
 reset 仕組み
 shumon.fujita
 
 HEAD
 index
 ワークツリー
 git reset --soft <commit ハッシュ> 書き換える
 
 
 git reset --mixed <commit ハッシュ> 書き換える
 書き換える
 
 git reset --hard <commit ハッシュ> 書き換える
 書き換える
 書き換える

  350. 455 reset 、オプションによって挙動が変わる。 
 おおまかに soft, mixed, hard 3 種類

    オプションがある。 
 指定した commit ハッシュに向けて、それぞれ 内容を書き換える。 
 
 
 
 
 --hard 全部書き換えるし、checkout と違い ある ? 
 
 reset 仕組み
 shumon.fujita
 
 HEAD
 index
 ワークツリー
 git reset --soft <commit ハッシュ> 書き換える
 
 
 git reset --mixed <commit ハッシュ> 書き換える
 書き換える
 
 git reset --hard <commit ハッシュ> 書き換える
 書き換える
 書き換える

  351. 456 reset 、オプションによって挙動が変わる。 
 おおまかに soft, mixed, hard 3 種類

    オプションがある。 
 指定した commit ハッシュに向けて、それぞれ 内容を書き換える。 
 
 
 
 
 --hard 全部書き換えるし、checkout と違い ある ? 
 reset と checkout 最も大きな違い 、HEAD が branch を参照していた場合 挙動。 
 
 reset 仕組み
 shumon.fujita
 
 HEAD
 index
 ワークツリー
 git reset --soft <commit ハッシュ> 書き換える
 
 
 git reset --mixed <commit ハッシュ> 書き換える
 書き換える
 
 git reset --hard <commit ハッシュ> 書き換える
 書き換える
 書き換える

  352. 457 checkout HEAD が branch を参照していても、書き換える HEAD み。 
 


    
 
 
 
 
 
 
 
 reset 仕組み
 shumon.fujita
 first commit
 master.txt を追加
 EAD E.md に
 「master」と追記
 develop.txt を追加
 master
 EAD E.md に
 「develop」と追記
 develop
 HEAD

  353. 458 checkout HEAD が branch を参照していても、書き換える HEAD み。 
 


    
 
 
 
 
 
 
 
 reset 仕組み
 shumon.fujita
 first commit
 master.txt を追加
 EAD E.md に
 「master」と追記
 develop.txt を追加
 master
 EAD E.md に
 「develop」と追記
 develop
 HEAD

  354. 459 checkout HEAD が branch を参照していても、書き換える HEAD み。 
 


    
 
 
 reset HEAD が branch を参照していた場合、branch 参照先も書き換える。 
 
 
 
 
 
 reset 仕組み
 shumon.fujita
 first commit
 master.txt を追加
 EAD E.md に
 「master」と追記
 develop.txt を追加
 master
 EAD E.md に
 「develop」と追記
 develop
 HEAD
 first commit
 master.txt を追加
 EAD E.md に
 「master」と追記
 develop.txt を追加
 master
 EAD E.md に
 「develop」と追記
 develop
 HEAD

  355. 460 checkout HEAD が branch を参照していても、書き換える HEAD み。 
 


    
 
 
 reset HEAD が branch を参照していた場合、branch 参照先も書き換える。 
 
 
 
 
 
 reset 仕組み
 shumon.fujita
 first commit
 master.txt を追加
 EAD E.md に
 「master」と追記
 develop.txt を追加
 master
 EAD E.md に
 「develop」と追記
 develop
 HEAD
 first commit
 master.txt を追加
 EAD E.md に
 「master」と追記
 develop.txt を追加
 EAD E.md に
 「develop」と追記
 develop
 master
 HEAD

  356. 463 branch 参照先を変えられる機能を応用すると、reset 色々な使い方ができる。 
 
 ① コミットを無かったことにする 
 1

    つ前 commit ハッシュに branch を向けることで、最新 コミットをなかったことにできる。 
 
 
 reset 仕組み
 shumon.fujita

  357. 464 branch 参照先を変えられる機能を応用すると、reset 色々な使い方ができる。 
 
 ① コミットを無かったことにする 
 1

    つ前 commit ハッシュに branch を向けることで、最新 コミットをなかったことにできる。 
 ② add 取り消し
 
 
 reset 仕組み
 shumon.fujita

  358. 465 branch 参照先を変えられる機能を応用すると、reset 色々な使い方ができる。 
 
 ① コミットを無かったことにする 
 1

    つ前 commit ハッシュに branch を向けることで、最新 コミットをなかったことにできる。 
 ② add 取り消し
 git reset --mixed HEAD とすると、index を HEAD 状況に戻せる で、add を取り消すことができる。 
 
 
 reset 仕組み
 shumon.fujita

  359. 466 branch 参照先を変えられる機能を応用すると、reset 色々な使い方ができる。 
 
 ① コミットを無かったことにする 
 1

    つ前 commit ハッシュに branch を向けることで、最新 コミットをなかったことにできる。 
 ② add 取り消し
 git reset --mixed HEAD とすると、index を HEAD 状況に戻せる で、add を取り消すことができる。 
 git 2.23 で追加された、restore というサブコマンドを使っても同じことができる。 ※experimental
 
 
 reset 仕組み
 shumon.fujita

  360. 467 branch 参照先を変えられる機能を応用すると、reset 色々な使い方ができる。 
 
 ① コミットを無かったことにする 
 1

    つ前 commit ハッシュに branch を向けることで、最新 コミットをなかったことにできる。 
 ② add 取り消し
 git reset --mixed HEAD とすると、index を HEAD 状況に戻せる で、add を取り消すことができる。 
 git 2.23 で追加された、restore というサブコマンドを使っても同じことができる。 ※experimental
 
 使い方 無限大。
 reset 仕組み
 shumon.fujita

  361. 470 割愛していた commit 時に「もうちょっと色々やってる」って話を詳しく。 
 - 各種 Hooks 起動
 -

    .git/hooks/ 以下にスクリプトを置いておくと、対応するイベントが発火したときに実行してくれる。 
 - どんなイベントを hook できる か 公式ドキュメント参照
 - reflog 更新
 - .git/logs/HEAD に HEAD 向き先 移動履歴を書き込む。 
 - HEAD が branch を参照していた場合、.git/log/refs/<branch 名> にも移動履歴を書き込む。 
 - ちなみにこれら 移動履歴 git reflog で確認できる。 
 - C I _EDI G 編集 
 - コミットメッセージを設定せずに commit すると自動でエディタが起動するが、そ エディタが開いているファイルが C I _EDI G
 - ここに書き込まれている内容が、コミットメッセージとして commit オブジェクトに取り込まれる。 
 休憩中 余談 ①
 shumon.fujita

  362. 471 reset を使っても、本当に commit がなかったことにできるわけで ない。 
 reset あくまでも、HEAD・index・ワークツリーを書き換えるコマンド ため、当然

    commit オブジェクトを 
 削除したり できない。
 
 そうすると、どこからも参照されていない commit が出来上がることがある。 
 → そういうオブジェクト 一定期間経つと、 git gc というコマンドが走って消される。 
 → ちなみにどこからも参照されていないオブジェクト git fsck で探せるよ
 休憩中 余談 ②
 shumon.fujita

  363. 472 blobオブジェクト 説明 時に、Gitで 基本的にファイル 差分でなくフルバックアップをするという話をした。 
 サイズ 大きなファイル 場合、微修正を加えるた

    にバックアップが取られてしまい、非効率。 
 実 差分 み記録する仕組みもある。 
 => ackfile
 容量 節約と効率化 ために、Git ときどきオブジェクト 中 いくつかを一つ バイナリファイルにパックする。 
 git gc コマンドを手動で実行した時、また リモートサーバーにプッシュした時にもGit パック処理を行う。 
 詳しく こちらを参照
 
 休憩中 余談 ③

  364. 473 GitHubで図が書ける話
 ermaid
 
 
 休憩中 余談 ④
 flowchart TB

    S(START) --> Q1{Gitが好きですか} -- yes --> G(Gitを使いましょう) Q1 -- no --> Q2{Gitを好きになれますか } -- yes --> G2(それではGitを使いましょう) Q2 -- no --> G3(とりあえずGitを使いましょう)