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

ビジュアルでわかる最初のGit (第二部)

ビジュアルでわかる最初のGit (第二部)

【オンライン】Git/GitHubをもっと知りたい!いまさら聞けない実用セミナー

https://algyan.connpass.com/event/208747/

解説動画があります: https://www.youtube.com/watch?v=bQl_R513IYw

Gitを、論理的な視点から捉えた良書はたくさんあります。なので、今回は別の切り口、「視覚的に捉える」という方法で解説を試みたいと思います。

第二部は、マージについての解説です。

Kouji Matsui

May 08, 2021
Tweet

More Decks by Kouji Matsui

Other Decks in Programming

Transcript

  1. (c) 2021 Kouji Matsui
    ビジュアルでわかる
    最初のGit
    (第二部)
    2021.5.8 GIT/GITHUBをもっと知りたい!
    いまさら聞けない実用セミナー
    - KOUJI MATSUI @KEKYO2

    View full-size slide

  2. (c) 2021 Kouji Matsui
    (c) 2021 Kouji Matsui
    Agenda
    ファイルを保存したい
    変更の蓄積をどうやってやる?
    歴史の改ざんと並行世界
    ラベルの正体
    みんなで開発をやりたい
    第二部: マージの真実

    View full-size slide

  3. (c) 2021 Kouji Matsui
    マージの真実
    ちょっと変更したい、からの並行世界生成:
    .git
    ここのコミットに
    手を加えたい
    “main”

    View full-size slide

  4. (c) 2021 Kouji Matsui
    マージの真実
    ちょっと変更したい、からの並行世界生成:
    .git
    “devel”
    新たにdevelブランチ
    作って…
    “main”

    View full-size slide

  5. (c) 2021 Kouji Matsui
    マージの真実
    ちょっと変更したい、からの並行世界生成:
    .git
    “devel”
    コミット
    “main”

    View full-size slide

  6. (c) 2021 Kouji Matsui
    マージの真実
    ちょっと変更したい、からの並行世界生成:
    .git
    “devel”
    修正できたから
    mainに反映したい
    反映したい差分
    “main”

    View full-size slide

  7. (c) 2021 Kouji Matsui
    マージの真実
    ちょっと変更したい、からの並行世界生成:
    .git
    “devel”
    “main”
    反映したい差分
    mainをチェックアウト
    しておき…

    View full-size slide

  8. (c) 2021 Kouji Matsui
    マージの真実
    「devel」から「main」にマージ:
    .git
    “devel”
    “main”
    マージ
    マージされた
    内容のコミット

    View full-size slide

  9. (c) 2021 Kouji Matsui
    マージの真実
    「devel」から「main」にマージ:
    .git
    “devel”
    “main”
    mainが進んだ

    View full-size slide

  10. (c) 2021 Kouji Matsui
    マージの真実
    「devel」から「main」にマージ:
    .git
    “devel”
    “main”
    親が2つある
    (2つの親IDを記録)

    View full-size slide

  11. (c) 2021 Kouji Matsui
    マージの真実
    何か冗長な気がする?
    .git
    “devel”
    “main”

    View full-size slide

  12. (c) 2021 Kouji Matsui
    マージの真実
    何か冗長な気がする?
    .git
    差分がある
    差分がない
    “devel”
    “main”

    View full-size slide

  13. (c) 2021 Kouji Matsui
    マージの真実
    何か冗長な気がする?
    .git
    差分がない
    “devel”
    “main”
    ファイルの内容
    同じでは??
    差分がある

    View full-size slide

  14. (c) 2021 Kouji Matsui
    マージの真実
    何か冗長な気がする?
    .git
    “devel”
    “main”
    差分
    同じだから
    不要?

    View full-size slide

  15. (c) 2021 Kouji Matsui
    マージの真実
    何か冗長な気がする?
    .git
    差分
    “devel”
    “main”

    View full-size slide

  16. (c) 2021 Kouji Matsui
    マージの真実
    何か冗長な気がする?
    .git
    つまり
    これと同等? 差分
    “main”
    “devel”

    View full-size slide

  17. (c) 2021 Kouji Matsui
    マージの真実
    何か冗長な気がする?
    .git
    “main”
    単に移動しただけ…?
    “devel”
    実は分岐などなかった…?

    View full-size slide

  18. (c) 2021 Kouji Matsui
    マージの真実
    マージの種類:
    ◦ 通常のマージ: マージ時に新たなコミットが発生(最初の例)。
    マージコミットには、親コミットIDが2つ記録される。
    ◦ ファーストフォワード: ブランチが移動しただけ(可能な場合)。
    マージコミットは作られない。
    マージ計算が行われないので、非常に高速。
    Gitのブランチは、ラベルによる「ツリーの様」を表していて、
    分岐構造を識別するものではない(再掲)
    ◦ ファーストフォワードの結果も、分岐とマージの一種。

    View full-size slide

  19. (c) 2021 Kouji Matsui
    マージの真実
    ちょっと変更したい、からの並行世界生成:
    .git
    ここのコミットに
    手を加えたい
    “main”

    View full-size slide

  20. (c) 2021 Kouji Matsui
    マージの真実
    ちょっと変更したい、からの並行世界生成:
    .git
    “devel”
    ここのコミットに
    手を加えたい
    “main”
    新たにdevelブランチ
    作って…

    View full-size slide

  21. (c) 2021 Kouji Matsui
    マージの真実
    ちょっと変更したい、からの並行世界生成:
    .git
    “devel”
    変更をコミット
    “main”

    View full-size slide

  22. (c) 2021 Kouji Matsui
    マージの真実
    ちょっと変更したい、からの並行世界生成:
    .git
    “devel”
    修正できたから
    mainに反映したい
    反映したい差分
    “main”

    View full-size slide

  23. (c) 2021 Kouji Matsui
    マージの真実
    ちょっと変更したい、からの並行世界生成:
    .git
    “devel”
    “main”
    反映したい差分
    mainをチェックアウト
    しておき…

    View full-size slide

  24. (c) 2021 Kouji Matsui
    マージの真実
    「devel」から「main」にマージ:
    .git
    “devel”
    “main”
    マージ
    マージコミット

    View full-size slide

  25. (c) 2021 Kouji Matsui
    マージの真実
    「devel」から「main」にマージ:
    .git
    “devel”
    “main”
    異なる差分がある
    異なる差分がある
    両者の変更点が
    含まれる

    View full-size slide

  26. (c) 2021 Kouji Matsui
    マージの真実
    通常のマージ時に、テキストベースでマージが行われる。
    競合(コンフリクト)が発生する可能性がある。
    ◦ 競合の解決方法は、Gitクライアント次第。diff形式に基づく修正やGUI
    で行うものなど。

    View full-size slide

  27. (c) 2021 Kouji Matsui
    マージの真実
    GUIクライアントで
    視覚的に操作できるマージ

    View full-size slide

  28. (c) 2021 Kouji Matsui
    マージの真実
    デフォルトの挙動は、可能ならファーストフォワード、出来
    なければ通常のマージが行われる。
    方法を強制したい場合:
    ◦ git merge --no-ff (ファーストフォワードしない)
    ◦ git merge --ff-only (ファーストフォワードのみ)

    View full-size slide

  29. (c) 2021 Kouji Matsui
    マージの真実
    実は同じ操作:
    ◦ ファーストフォワード
    ◦ git reset --hard で順方向のコミットに移動する

    View full-size slide

  30. (c) 2021 Kouji Matsui
    マージの真実
    修正を最新のコミット基準にする:
    .git
    “devel”
    修正開始:
    新たにdevelブランチ作って…
    “main”

    View full-size slide

  31. (c) 2021 Kouji Matsui
    マージの真実
    修正を最新のコミット基準にする:
    .git
    “main”
    “devel”
    修正差分

    View full-size slide

  32. (c) 2021 Kouji Matsui
    マージの真実
    修正を最新のコミット基準にする:
    .git
    “main”
    “devel”
    修正差分
    誰かがmainを
    変更しちゃった

    View full-size slide

  33. (c) 2021 Kouji Matsui
    マージの真実
    修正を最新のコミット基準にする:
    .git
    “main”
    “devel”
    この変更を今のmain
    からの修正にしたい…
    修正差分

    View full-size slide

  34. (c) 2021 Kouji Matsui
    マージの真実
    修正を最新のコミット基準にする:
    .git
    “main”
    “devel”
    修正差分
    つまり
    こうしたい…

    View full-size slide

  35. (c) 2021 Kouji Matsui
    マージの真実
    修正を最新のコミット基準にする:
    .git
    “main”
    “devel”
    修正差分

    View full-size slide

  36. (c) 2021 Kouji Matsui
    マージの真実
    リベース (git rebase main devel):
    .git
    “main”
    “devel”
    差分
    同じような修正をちまちまと手で
    やらなくても、勝手にやってくれる

    View full-size slide

  37. (c) 2021 Kouji Matsui
    マージの真実
    リベースも、一種のマージ操作。
    ◦ 修正の手動移植をした場合、どこかで競合が発生する可能性がありそ
    うですね?
    ◦ 同様に、リベースで競合が発生した場合は、手動で修正する必要があ
    ります。

    View full-size slide

  38. (c) 2021 Kouji Matsui
    マージの真実
    リベースに成功すると:
    .git
    “main”
    “devel”

    View full-size slide

  39. (c) 2021 Kouji Matsui
    マージの真実
    リベースに成功すると:
    .git
    “main” “devel”

    View full-size slide

  40. (c) 2021 Kouji Matsui
    マージの真実
    リベースに成功すると:
    .git
    “main” “devel”
    分岐構造は気のせい
    (Gitは分岐構造を認知しない)

    View full-size slide

  41. (c) 2021 Kouji Matsui
    マージの真実
    マージ競合の修正で苦労する…
    ◦ マージしたときに競合が発生しないような修正の仕方にする。
    ◦ 共同作業(後述)するときに、事前に打ち合わせして、近しいところ
    を同時に修正しないようにする。
    Gitを使っても、銀の弾丸は無いので、生き延びるには戦術・
    戦略が必要です。
    但し、Gitはそういう工夫が非常にやりやすいです。

    View full-size slide

  42. (c) 2021 Kouji Matsui
    マージの真実
    pushしてfetchされるまでは?:
    .git
    “devel”
    “main”
    “main”
    setuのローカルは
    ここを指している?
    別の人には自動的に
    伝達しない

    View full-size slide

  43. (c) 2021 Kouji Matsui
    マージの真実
    ツリー構造を把握しやすい
    GUIクライアントが生きてくる

    View full-size slide

  44. (c) 2021 Kouji Matsui
    Gitでその次へ!
    素材: いらすとや さん
    素材: Vincent Le Moignさん他 (CC-BY)

    View full-size slide