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
PRO

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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide