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=47tv5d74ZAE

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

解説に含む内容: Gitを使う上で、知っておきたい概観の知識 (→知らないと困ること)
解説に含まない内容: Gitコマンドの具体的な使用方法。Gitの内部構造

Kouji Matsui

May 08, 2021
Tweet

More Decks by Kouji Matsui

Other Decks in Programming

Transcript

  1. (c) 2021 Kouji Matsui Kouji Matsui – kozy, kekyo •

    NAGOYA city, AICHI pref., JP • Twitter – @kekyo2, @kozy_kekyo • Self employed (I’m looking for a job) • Microsoft Most Valuable Professional VS and DevTech 2015- • Center CLR organizer. • .NET/F#/IL/metaprogramming or like… • Bicycle rider
  2. (c) 2021 Kouji Matsui はじめに この解説に含む内容: ◦ Gitを使う上で、知っておきたい概観の知識 → 知らないと困ること

    この解説に含まない内容: ◦ Gitコマンドの具体的な使用方法 ◦ Gitの内部構造 ◦ 公式の解説があります: https://git-scm.com/book/ja/v2 ◦ 各種Gitクライアント(触れる程度に) ◦ 各種Gitサービス
  3. (c) 2021 Kouji Matsui はじめに 特にお勧めの方: ◦ Gitの何が良いのかわからない。 ◦ 見よう見まねでGitを使ってるけど、良くわかってない。

    ◦ これから覚えたいけど、使用方法以外の部分を補完したい。 ◦ コマンドの使い方は他の資料を見れば分かるので、考え方を理解した い。
  4. (c) 2021 Kouji Matsui (c) 2021 Kouji Matsui Agenda ファイルを保存したい

    変更の蓄積をどうやってやる? 歴史の改ざんと並行世界 札の正体 みんなで開発をやりたい 第二部: マージの真実
  5. (c) 2021 Kouji Matsui ファイルを保存したい 感じる問題: ◦ 手順が明確じゃない ファイル名のつけ方とか ◦

    堅牢じゃない コピー間の関連性が失われてしまう可能性 後からしれっと変更出来てしまう ◦ 共同作業がやりにくい たまたま、同じファイル名を付けようとした
  6. (c) 2021 Kouji Matsui ファイルを保存したい 感じる問題: ◦ 手順が明確じゃない ファイル名のつけ方とか ◦

    堅牢じゃない コピー間の関連性が失われてしまう可能性 後からしれっと変更出来てしまう ◦ 共同作業がやりにくい たまたま、同じファイル名を付けようとした 問題を回避するために、複雑な手順を導入 vs. 全てをあきらめ、間違ってもまあいいや
  7. (c) 2021 Kouji Matsui (c) 2021 Kouji Matsui Agenda ファイルを保存したい

    変更の蓄積をどうやってやる? 歴史の改ざんと並行世界 札の正体 みんなで開発をやりたい 第二部: マージの真実
  8. (c) 2021 Kouji Matsui 変更の蓄積をどうやってやる? コミットIDの付与に関係する情報: 情報 詳細 Author ファイル作成者

    “Kouji Matsui <[email protected]>" Date コミット日時 Parent 親のコミットのID File structures and blobs ディレクトリやファイルの構造と内容 6a28fb753eb4c9… コミットIDを計算する (ハッシュ関数)
  9. (c) 2021 Kouji Matsui (c) 2021 Kouji Matsui Agenda ファイルを保存したい

    変更の蓄積をどうやってやる? 歴史の改ざんと並行世界 札の正体 みんなで開発をやりたい 第二部: マージの真実
  10. (c) 2021 Kouji Matsui 歴史の改ざんと並行世界 ファイルの一部だけ変更して、直したい… .git 6a28fb753eb4c9… 親: なし

    b1ff9de048ca952… 親: 6a28fb753eb4c9… 663ca52f97b3ce87… 親: b1ff9de048ca952… c5da2b979d1156… 親: 6a28fb753eb4c9…
  11. (c) 2021 Kouji Matsui 歴史の改ざんと並行世界 ファイルの一部だけ変更して、直したい… .git 6a28fb753eb4c9… 親: なし

    b1ff9de048ca952… 親: 6a28fb753eb4c9… 663ca52f97b3ce87… 親: b1ff9de048ca952… c5da2b979d1156… 親: 6a28fb753eb4c9… 違うIDになるので どうやっても 「変更」はできない
  12. (c) 2021 Kouji Matsui 歴史の改ざんと並行世界 途中で改ざんすると? .git 6a28fb753eb4c9… 親: なし

    b1ff9de048ca952… 親: 6a28fb753eb4c9… 663ca52f97b3ce87… 親: b1ff9de048ca952… “HEAD” 6a28fb753eb4c9… 今はここを指している
  13. (c) 2021 Kouji Matsui 歴史の改ざんと並行世界 途中で改ざんすると、改ざんした方を指します: .git 6a28fb753eb4c9… 親: なし

    b1ff9de048ca952… 親: 6a28fb753eb4c9… 663ca52f97b3ce87… 親: b1ff9de048ca952… c5da2b979d1156… 親: 6a28fb753eb4c9… “HEAD” c5da2b979d1156… こっちを指す
  14. (c) 2021 Kouji Matsui 歴史の改ざんと並行世界 コミットは改ざん出来ない: ◦ 改ざんすると、違うコミットIDになる。 ◦ 改ざんすると、同じ親を指す異なるコミットになる。

    ◦ 親の追跡が「HEAD」で行われる。 元のコミットを削除すれば、変更したことになる? ◦ コミットIDが変わっても良いなら。 ◦ それはもはや異なる歴史。 ◦ 並行世界の誕生?
  15. (c) 2021 Kouji Matsui (c) 2021 Kouji Matsui Agenda ファイルを保存したい

    変更の蓄積をどうやってやる? 歴史の改ざんと並行世界 札の正体 みんなで開発をやりたい 第二部: マージの真実
  16. (c) 2021 Kouji Matsui 札の正体 ID覚えるの大変だし何かいい方法は? 名前つけてみる? .git 6a28fb753eb4c9… b1ff9de048ca952…

    663ca52f97b3ce87… c5da2b979d1156… “foobar” b1ff9de048ca952… “HEAD” c5da2b979d1156… 何だか、HEADに 似てる?
  17. (c) 2021 Kouji Matsui 札の正体 ブランチが複数存在する状態: .git “foobar” b1ff9de048ca952… “HEAD”

    c5da2b979d1156… “main” 594f2bacae342b7… “devel” 993e92d68c31d25… “baz” 993e92d68c31d25…
  18. (c) 2021 Kouji Matsui 札の正体 ブランチの真実: もし、札がこのように付いていれば: .git “main” 594f2bacae342b7…

    “devel” 993e92d68c31d25… という「分岐」が 存在しているように見える… “foobar” cf1e5eb778ad6c9…
  19. (c) 2021 Kouji Matsui 札の正体 コミットで動かない名前の札:「タグ」 .git “release2157” c5da2b979d1156… “devel”

    c5da2b979d1156… コミット 同じコミットを 指しているブランチ 同じコミットを 指しているタグ
  20. (c) 2021 Kouji Matsui 札の正体 HEADの真の姿: .git “devel” c5da2b979d1156… “HEAD”

    devel ブランチは移動するが HEADはdevelを指したまま
  21. (c) 2021 Kouji Matsui 札の正体 HEADの真の姿: .git “HEAD” devel “devel”

    c5da2b979d1156… コミット “foobar” c5da2b979d1156… ブランチが複数あったとしても
  22. (c) 2021 Kouji Matsui 札の正体 HEADの真の姿: .git “devel” c5da2b979d1156… “HEAD”

    devel HEADが指している ブランチが移動する “foobar” c5da2b979d1156… 移動しない
  23. (c) 2021 Kouji Matsui 札の正体 札の種類についてのまとめ: ◦ ブランチは、コミットによって移動する。 ◦ タグは、コミットによって移動しない。

    ◦ HEADは、現在のチェックアウトを保持する。 → 札は、コミットIDやブランチを示すポインタでしかない。 注意: 「札」はこの解説固有の呼称です。 “main” “release2157” “HEAD”
  24. (c) 2021 Kouji Matsui 札の正体 以上から、少し前に話題になった件: ◦ ”main”または“master”という名称に、特別な意味はない。 ◦ “master”を”main”に置き換え(変更)しても、Git上特に不都合はない。

    ◦ 何なら、“master”と”main”が同居しても良い。 ◦ それどころか、”master”や”main”が存在しなくても問題ない。 事もわかると思います。 なお、“main”または”master”は、Gitのデフォルトのブランチ名 です。 “main” “master” VS
  25. (c) 2021 Kouji Matsui 札の正体 TIPS: グチャグチャになったら: .git “devel” git

    reset --hard で、強制的に 指定したコミットIDに移動
  26. (c) 2021 Kouji Matsui (c) 2021 Kouji Matsui Agenda ファイルを保存したい

    変更の蓄積をどうやってやる? 歴史の改ざんと並行世界 札の正体 みんなで開発をやりたい 第二部: マージの真実
  27. (c) 2021 Kouji Matsui みんなで開発をやりたい 右のリポジトリを取り込む (git fetch) : .git

    だれかの .git 1 2 3 9 7 5 1 3 4 5 6 7 8 親のコミットIDは2 存在しないコミット 2 9
  28. (c) 2021 Kouji Matsui みんなで開発をやりたい “git fetch”コマンドを実行すると、相手から足りないコミット を取り込むことができる。 ◦ データベースの同期機能(レプリケーション)のようなもの。

    片方向のみ(双方向ではない)。 .gitディレクトリ内のデータが処理されるため、今手元で編集 中のファイルやディレクトリには影響しない。
  29. (c) 2021 Kouji Matsui みんなで開発をやりたい 変更点を送信する (git push): .git だれかの

    .git 1 2 3 4 5 6 7 8 mainに関係のある コミット 9 1 2 3 7 5 “main”
  30. (c) 2021 Kouji Matsui みんなで開発をやりたい 変更点を送信する (git push): .git だれかの

    .git 1 2 3 4 5 6 7 8 mainに関係のある コミット 9 1 2 3 7 4 5 “main” “main” ID:4が転送され ブランチが移動
  31. (c) 2021 Kouji Matsui みんなで開発をやりたい 変更点を送信する (git push): .git だれかの

    .git 1 2 3 4 5 6 7 8 9 1 2 3 7 4 5 “main” “main” 相手のブランチが 勝手に変わるのは まずいのでは??
  32. (c) 2021 Kouji Matsui みんなで開発をやりたい 変更点を送信する (git push): .git Gitサーバー

    1 2 3 4 5 6 7 8 9 1 2 3 7 4 5 “main” “main” Gitサーバーの mainブランチが移動 OK!
  33. (c) 2021 Kouji Matsui みんなで開発をやりたい 順方向の移動であれば、最新のブランチをpushできる。 ◦ 順方向とは、より新しいコミット(小孫)方向。 順方向ではない場合は、push時にエラーになる。 ◦

    親方向への移動を行った。 ◦ まったく関係のないコミットに移動している。 そんなことあるの? ◦ 例: git reset --hardで逆方向に移動したブランチ ◦ 例: 誰かがマージしたために、ブランチが移動していた → 一旦fetchして、ローカルでマージしてからpush ◦ 例: リベースで新たなコミットIDを指すことになったブランチ
  34. (c) 2021 Kouji Matsui みんなで開発をやりたい エラーを無視して強制するのが、巷で言う”git push --force” ◦ force

    pushはサーバーでエラーとなるように設定されている場合がある。 ◦ 出来た方が自由度が高いので、誤用は運用で回避した方が良いです。 pushの逆とも言えるfetchでは、勝手にブランチは移動しない: ◦ 前に触れた通り。 ◦ 但し、“git pull”は別。pullは、fetchしてmergeするのと同じ。
  35. (c) 2021 Kouji Matsui みんなで開発をやりたい リモートサーバーの特定 .git .git neko .git

    .git “git push origin main” → originのmainにpushする “main” “main”
  36. (c) 2021 Kouji Matsui みんなで開発をやりたい リモートサーバーの特定 .git .git .git sumo

    .git “git push neko main” → nekoのmainにpushする “main” “main”