Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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