Save 37% off PRO during our Black Friday Sale! »

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

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

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

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

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

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

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

924d7de2a5a7102a597728e5edbbff78?s=128

Kouji Matsui
PRO

May 08, 2021
Tweet

Transcript

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

    - KOUJI MATSUI @KEKYO2
  2. (c) 2021 Kouji Matsui (c) 2021 Kouji Matsui Agenda ファイルを保存したい

    変更の蓄積をどうやってやる? 歴史の改ざんと並行世界 ラベルの正体 みんなで開発をやりたい 第二部: マージの真実
  3. (c) 2021 Kouji Matsui マージの真実 ちょっと変更したい、からの並行世界生成: .git ここのコミットに 手を加えたい “main”

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

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

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

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

    mainをチェックアウト しておき…
  8. (c) 2021 Kouji Matsui マージの真実 「devel」から「main」にマージ: .git “devel” “main” マージ

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

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

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

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

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

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

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

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

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

    実は分岐などなかった…?
  18. (c) 2021 Kouji Matsui マージの真実 マージの種類: ◦ 通常のマージ: マージ時に新たなコミットが発生(最初の例)。 マージコミットには、親コミットIDが2つ記録される。

    ◦ ファーストフォワード: ブランチが移動しただけ(可能な場合)。 マージコミットは作られない。 マージ計算が行われないので、非常に高速。 Gitのブランチは、ラベルによる「ツリーの様」を表していて、 分岐構造を識別するものではない(再掲) ◦ ファーストフォワードの結果も、分岐とマージの一種。
  19. (c) 2021 Kouji Matsui マージの真実 ちょっと変更したい、からの並行世界生成: .git ここのコミットに 手を加えたい “main”

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

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

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

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

    mainをチェックアウト しておき…
  24. (c) 2021 Kouji Matsui マージの真実 「devel」から「main」にマージ: .git “devel” “main” マージ

    マージコミット
  25. (c) 2021 Kouji Matsui マージの真実 「devel」から「main」にマージ: .git “devel” “main” 異なる差分がある

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

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

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

    merge --no-ff (ファーストフォワードしない) ◦ git merge --ff-only (ファーストフォワードのみ)
  29. (c) 2021 Kouji Matsui マージの真実 実は同じ操作: ◦ ファーストフォワード ◦ git

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

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

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

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

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

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

  36. (c) 2021 Kouji Matsui マージの真実 リベース (git rebase main devel):

    .git “main” “devel” 差分 同じような修正をちまちまと手で やらなくても、勝手にやってくれる
  37. (c) 2021 Kouji Matsui マージの真実 リベースも、一種のマージ操作。 ◦ 修正の手動移植をした場合、どこかで競合が発生する可能性がありそ うですね? ◦

    同様に、リベースで競合が発生した場合は、手動で修正する必要があ ります。
  38. (c) 2021 Kouji Matsui マージの真実 リベースに成功すると: .git “main” “devel”

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

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

    (Gitは分岐構造を認知しない)
  41. (c) 2021 Kouji Matsui マージの真実 マージ競合の修正で苦労する… ◦ マージしたときに競合が発生しないような修正の仕方にする。 ◦ 共同作業(後述)するときに、事前に打ち合わせして、近しいところ

    を同時に修正しないようにする。 Gitを使っても、銀の弾丸は無いので、生き延びるには戦術・ 戦略が必要です。 但し、Gitはそういう工夫が非常にやりやすいです。
  42. (c) 2021 Kouji Matsui マージの真実 pushしてfetchされるまでは?: .git “devel” “main” “main”

    setuのローカルは ここを指している? 別の人には自動的に 伝達しない
  43. (c) 2021 Kouji Matsui マージの真実 ツリー構造を把握しやすい GUIクライアントが生きてくる

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

    Le Moignさん他 (CC-BY)