【オンライン】Git/GitHubをもっと知りたい!いまさら聞けない実用セミナー
https://algyan.connpass.com/event/208747/
解説動画があります: https://www.youtube.com/watch?v=bQl_R513IYw
Gitを、論理的な視点から捉えた良書はたくさんあります。なので、今回は別の切り口、「視覚的に捉える」という方法で解説を試みたいと思います。
第二部は、マージについての解説です。
(c) 2021 Kouji Matsuiビジュアルでわかる最初のGit(第二部)2021.5.8 GIT/GITHUBをもっと知りたい!いまさら聞けない実用セミナー- KOUJI MATSUI @KEKYO2
View Slide
(c) 2021 Kouji Matsui(c) 2021 Kouji MatsuiAgendaファイルを保存したい変更の蓄積をどうやってやる?歴史の改ざんと並行世界ラベルの正体みんなで開発をやりたい第二部: マージの真実
(c) 2021 Kouji Matsuiマージの真実ちょっと変更したい、からの並行世界生成:.gitここのコミットに手を加えたい“main”
(c) 2021 Kouji Matsuiマージの真実ちょっと変更したい、からの並行世界生成:.git“devel”新たにdevelブランチ作って…“main”
(c) 2021 Kouji Matsuiマージの真実ちょっと変更したい、からの並行世界生成:.git“devel”コミット“main”
(c) 2021 Kouji Matsuiマージの真実ちょっと変更したい、からの並行世界生成:.git“devel”修正できたからmainに反映したい反映したい差分“main”
(c) 2021 Kouji Matsuiマージの真実ちょっと変更したい、からの並行世界生成:.git“devel”“main”反映したい差分mainをチェックアウトしておき…
(c) 2021 Kouji Matsuiマージの真実「devel」から「main」にマージ:.git“devel”“main”マージマージされた内容のコミット
(c) 2021 Kouji Matsuiマージの真実「devel」から「main」にマージ:.git“devel”“main”mainが進んだ
(c) 2021 Kouji Matsuiマージの真実「devel」から「main」にマージ:.git“devel”“main”親が2つある(2つの親IDを記録)
(c) 2021 Kouji Matsuiマージの真実何か冗長な気がする?.git“devel”“main”
(c) 2021 Kouji Matsuiマージの真実何か冗長な気がする?.git差分がある差分がない“devel”“main”
(c) 2021 Kouji Matsuiマージの真実何か冗長な気がする?.git差分がない“devel”“main”ファイルの内容同じでは??差分がある
(c) 2021 Kouji Matsuiマージの真実何か冗長な気がする?.git“devel”“main”差分同じだから不要?
(c) 2021 Kouji Matsuiマージの真実何か冗長な気がする?.git差分“devel”“main”
(c) 2021 Kouji Matsuiマージの真実何か冗長な気がする?.gitつまりこれと同等? 差分“main”“devel”
(c) 2021 Kouji Matsuiマージの真実何か冗長な気がする?.git“main”単に移動しただけ…?“devel”実は分岐などなかった…?
(c) 2021 Kouji Matsuiマージの真実マージの種類:◦ 通常のマージ: マージ時に新たなコミットが発生(最初の例)。マージコミットには、親コミットIDが2つ記録される。◦ ファーストフォワード: ブランチが移動しただけ(可能な場合)。マージコミットは作られない。マージ計算が行われないので、非常に高速。Gitのブランチは、ラベルによる「ツリーの様」を表していて、分岐構造を識別するものではない(再掲)◦ ファーストフォワードの結果も、分岐とマージの一種。
(c) 2021 Kouji Matsuiマージの真実ちょっと変更したい、からの並行世界生成:.git“devel”ここのコミットに手を加えたい“main”新たにdevelブランチ作って…
(c) 2021 Kouji Matsuiマージの真実ちょっと変更したい、からの並行世界生成:.git“devel”変更をコミット“main”
(c) 2021 Kouji Matsuiマージの真実「devel」から「main」にマージ:.git“devel”“main”マージマージコミット
(c) 2021 Kouji Matsuiマージの真実「devel」から「main」にマージ:.git“devel”“main”異なる差分がある異なる差分がある両者の変更点が含まれる
(c) 2021 Kouji Matsuiマージの真実通常のマージ時に、テキストベースでマージが行われる。競合(コンフリクト)が発生する可能性がある。◦ 競合の解決方法は、Gitクライアント次第。diff形式に基づく修正やGUIで行うものなど。
(c) 2021 Kouji Matsuiマージの真実GUIクライアントで視覚的に操作できるマージ
(c) 2021 Kouji Matsuiマージの真実デフォルトの挙動は、可能ならファーストフォワード、出来なければ通常のマージが行われる。方法を強制したい場合:◦ git merge --no-ff (ファーストフォワードしない)◦ git merge --ff-only (ファーストフォワードのみ)
(c) 2021 Kouji Matsuiマージの真実実は同じ操作:◦ ファーストフォワード◦ git reset --hard で順方向のコミットに移動する
(c) 2021 Kouji Matsuiマージの真実修正を最新のコミット基準にする:.git“devel”修正開始:新たにdevelブランチ作って…“main”
(c) 2021 Kouji Matsuiマージの真実修正を最新のコミット基準にする:.git“main”“devel”修正差分
(c) 2021 Kouji Matsuiマージの真実修正を最新のコミット基準にする:.git“main”“devel”修正差分誰かがmainを変更しちゃった
(c) 2021 Kouji Matsuiマージの真実修正を最新のコミット基準にする:.git“main”“devel”この変更を今のmainからの修正にしたい…修正差分
(c) 2021 Kouji Matsuiマージの真実修正を最新のコミット基準にする:.git“main”“devel”修正差分つまりこうしたい…
(c) 2021 Kouji Matsuiマージの真実リベース (git rebase main devel):.git“main”“devel”差分同じような修正をちまちまと手でやらなくても、勝手にやってくれる
(c) 2021 Kouji Matsuiマージの真実リベースも、一種のマージ操作。◦ 修正の手動移植をした場合、どこかで競合が発生する可能性がありそうですね?◦ 同様に、リベースで競合が発生した場合は、手動で修正する必要があります。
(c) 2021 Kouji Matsuiマージの真実リベースに成功すると:.git“main”“devel”
(c) 2021 Kouji Matsuiマージの真実リベースに成功すると:.git“main” “devel”
(c) 2021 Kouji Matsuiマージの真実リベースに成功すると:.git“main” “devel”分岐構造は気のせい(Gitは分岐構造を認知しない)
(c) 2021 Kouji Matsuiマージの真実マージ競合の修正で苦労する…◦ マージしたときに競合が発生しないような修正の仕方にする。◦ 共同作業(後述)するときに、事前に打ち合わせして、近しいところを同時に修正しないようにする。Gitを使っても、銀の弾丸は無いので、生き延びるには戦術・戦略が必要です。但し、Gitはそういう工夫が非常にやりやすいです。
(c) 2021 Kouji Matsuiマージの真実pushしてfetchされるまでは?:.git“devel”“main”“main”setuのローカルはここを指している?別の人には自動的に伝達しない
(c) 2021 Kouji Matsuiマージの真実ツリー構造を把握しやすいGUIクライアントが生きてくる
(c) 2021 Kouji MatsuiGitでその次へ!素材: いらすとや さん素材: Vincent Le Moignさん他 (CC-BY)