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
    ビジュアルでわかる
    最初のGit
    (第一部)
    2021.5.8 GIT/GITHUBをもっと知りたい!
    いまさら聞けない実用セミナー
    - KOUJI MATSUI @KEKYO2

    View full-size slide

  2. (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

    View full-size slide

  3. (c) 2021 Kouji Matsui
    はじめに
    今日はGitの話をします。
    Gitを、論理的な視点から捉えた良書はたくさんあります。
    なので、ここでは別の切り口、
    視覚的に捉える
    という方法で解説を試みたいと思います。

    View full-size slide

  4. (c) 2021 Kouji Matsui
    はじめに
    この解説に含む内容:
    ◦ Gitを使う上で、知っておきたい概観の知識
    → 知らないと困ること
    この解説に含まない内容:
    ◦ Gitコマンドの具体的な使用方法
    ◦ Gitの内部構造
    ◦ 公式の解説があります: https://git-scm.com/book/ja/v2
    ◦ 各種Gitクライアント(触れる程度に)
    ◦ 各種Gitサービス

    View full-size slide

  5. (c) 2021 Kouji Matsui
    はじめに
    特にお勧めの方:
    ◦ Gitの何が良いのかわからない。
    ◦ 見よう見まねでGitを使ってるけど、良くわかってない。
    ◦ これから覚えたいけど、使用方法以外の部分を補完したい。
    ◦ コマンドの使い方は他の資料を見れば分かるので、考え方を理解した
    い。

    View full-size slide

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

    View full-size slide

  7. (c) 2021 Kouji Matsui
    ファイルを保存したい
    今まで、ソースコード管理とかしたことない…
    Copying metaphor: Microsoft Windows 2000 in Feb 2000

    View full-size slide

  8. (c) 2021 Kouji Matsui
    ファイルを保存したい
    だって、こうするしかないじゃない

    View full-size slide

  9. (c) 2021 Kouji Matsui
    ファイルを保存したい
    我々の世界でもこうですよ…

    View full-size slide

  10. (c) 2021 Kouji Matsui
    ファイルを保存したい
    何が知りたい?

    View full-size slide

  11. (c) 2021 Kouji Matsui
    ファイルを保存したい
    何が知りたい?
    どれが最新?
    どれとどれが関連している?
    どう違う?

    View full-size slide

  12. (c) 2021 Kouji Matsui
    ファイルを保存したい
    「難しいのはいいや。ディレクトリ配下の全てのファイルを
    コピって保存しておけばええやろ」
    結局、全部コピーして
    バックアップすれば安全

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  15. (c) 2021 Kouji Matsui
    ファイルを保存したい
    大丈夫大丈夫、最悪日付を見ればわかる
    間違えて削除しちゃったので
    バックアップからコピー

    View full-size slide

  16. (c) 2021 Kouji Matsui
    ファイルを保存したい
    大丈夫大丈夫、最悪日付を見ればわかる… ギャーーー
    もはや忘却の彼方
    CVSの頃にやらかした…

    View full-size slide

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

    View full-size slide

  18. (c) 2021 Kouji Matsui
    変更の蓄積をどうやってやる?
    Gitにおいては、”.git”ディレクトリ配下に保存される
    “git init” コマンドで
    そのディレクトリ配下に
    .gitが作られる

    View full-size slide

  19. (c) 2021 Kouji Matsui
    変更の蓄積をどうやってやる?
    全てのファイル群を一意に識別できるIDを振る
    6a28fb753eb4c9…

    View full-size slide

  20. (c) 2021 Kouji Matsui
    変更の蓄積をどうやってやる?
    全てのファイル群を一意に識別できるIDを振る
    6a28fb753eb4c9…
    b1ff9de048ca952…
    ファイル追加・削除
    内容の変更
    をすると、まったく違うIDになる
    (連番じゃない)

    View full-size slide

  21. (c) 2021 Kouji Matsui
    変更の蓄積をどうやってやる?
    全てのファイル群を一意に識別できるIDを振る
    6a28fb753eb4c9…
    b1ff9de048ca952…
    ファイルの内容の他に、
    誰が作成したか・いつ作成したか
    の情報も含む

    View full-size slide

  22. (c) 2021 Kouji Matsui
    変更の蓄積をどうやってやる?
    全てのファイル群を一意に識別できるIDを振る
    6a28fb753eb4c9…
    b1ff9de048ca952…
    b1ff9de048ca952…
    仮に、まったく同じ条件なら
    まったく同じIDになる

    View full-size slide

  23. (c) 2021 Kouji Matsui
    変更の蓄積をどうやってやる?
    「コミット」する (git commit)
    6a28fb753eb4c9…
    .git
    IDが付く

    View full-size slide

  24. (c) 2021 Kouji Matsui
    変更の蓄積をどうやってやる?
    一部変更して「コミット」する
    b1ff9de048ca952…
    .git
    違うIDが付く
    ファイル変更
    した

    View full-size slide

  25. (c) 2021 Kouji Matsui
    変更の蓄積をどうやってやる?
    .gitディレクトリには、沢山のコミットが存在する:
    .git
    6a28fb753eb4c9… b1ff9de048ca952… 663ca52f97b3ce87…

    View full-size slide

  26. (c) 2021 Kouji Matsui
    変更の蓄積をどうやってやる?
    コミットした順に関連付けられる
    .git
    6a28fb753eb4c9… b1ff9de048ca952… 663ca52f97b3ce87…

    View full-size slide

  27. (c) 2021 Kouji Matsui
    変更の蓄積をどうやってやる?
    実際は親のコミットIDを覚えている
    .git
    6a28fb753eb4c9…
    親: なし
    b1ff9de048ca952…
    親: 6a28fb753eb4c9…
    663ca52f97b3ce87…
    親: b1ff9de048ca952…

    View full-size slide

  28. (c) 2021 Kouji Matsui
    変更の蓄積をどうやってやる?
    コミットIDの付与に関係する情報:
    情報 詳細
    Author ファイル作成者 “Kouji Matsui "
    Date コミット日時
    Parent 親のコミットのID
    File structures and blobs ディレクトリやファイルの構造と内容
    6a28fb753eb4c9…
    コミットIDを計算する
    (ハッシュ関数)

    View full-size slide

  29. (c) 2021 Kouji Matsui
    変更の蓄積をどうやってやる?
    補足: ディレクトリ構造・ファイルの内容は、実際には変更さ
    れたファイルだけが保存の対象になります。
    ファイル内容の差分ではなく、ファイル全体が保存されます。

    View full-size slide

  30. (c) 2021 Kouji Matsui
    変更の蓄積をどうやってやる?
    ファイル内容の差分(例えばdiff/patch形式)を保存する方が、
    ストレージ容量を削減出来て良さそうですが:
    ◦ あるコミットをチェックアウトするときに、ファイルの再現計算に時
    間がかかる(過去の差分をすべてpatchする…)
    ◦ 途中の差分が壊れていると、以降のコミットが全滅する
    Gitの場合は、可逆圧縮(zlib)を使うことで、サイズを減らして
    います。

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  35. (c) 2021 Kouji Matsui
    歴史の改ざんと並行世界
    ファイルの一部だけ変更して、直したい…
    .git
    6a28fb753eb4c9…
    親: なし
    b1ff9de048ca952…
    親: 6a28fb753eb4c9…
    663ca52f97b3ce87…
    親: b1ff9de048ca952…
    c5da2b979d1156…
    親: 6a28fb753eb4c9…
    違うIDになるので
    どうやっても
    「変更」はできない

    View full-size slide

  36. (c) 2021 Kouji Matsui
    歴史の改ざんと並行世界
    どのコミットを親とするか?
    6a28fb753eb4c9…
    変更中

    View full-size slide

  37. (c) 2021 Kouji Matsui
    歴史の改ざんと並行世界
    どのコミットを親とするか?
    6a28fb753eb4c9…
    現在のコミットID:
    6a28fb753eb4c9…
    変更中
    付箋のようなもの
    (札)が必要

    View full-size slide

  38. (c) 2021 Kouji Matsui
    歴史の改ざんと並行世界
    どのコミットを親とするか?
    c5da2b979d1156…
    親: 6a28fb753eb4c9…
    6a28fb753eb4c9…
    現在のコミットID:
    c5da2b979d1156…
    コミット
    付け替える
    (IDが変わる)

    View full-size slide

  39. (c) 2021 Kouji Matsui
    歴史の改ざんと並行世界
    現在のコミットを示す札を「HEAD」と呼びます
    c5da2b979d1156…
    6a28fb753eb4c9…
    “HEAD”
    c5da2b979d1156…

    View full-size slide

  40. (c) 2021 Kouji Matsui
    歴史の改ざんと並行世界
    コミットするとHEAD札はどんどん移動します:
    .git
    6a28fb753eb4c9… b1ff9de048ca952… 663ca52f97b3ce87…
    “HEAD”
    663ca52f97b3ce87…
    コミット
    コミット

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  43. (c) 2021 Kouji Matsui
    歴史の改ざんと並行世界
    コミットは改ざん出来ない:
    ◦ 改ざんすると、違うコミットIDになる。
    ◦ 改ざんすると、同じ親を指す異なるコミットになる。
    ◦ 親の追跡が「HEAD」で行われる。
    元のコミットを削除すれば、変更したことになる?
    ◦ コミットIDが変わっても良いなら。
    ◦ それはもはや異なる歴史。
    ◦ 並行世界の誕生?

    View full-size slide

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

    View full-size slide

  45. (c) 2021 Kouji Matsui
    札の正体
    ID覚えるの大変だし何かいい方法は? 名前つけてみる?
    .git
    6a28fb753eb4c9… b1ff9de048ca952… 663ca52f97b3ce87…
    c5da2b979d1156… “foobar”
    b1ff9de048ca952…
    名前を付けた

    View full-size slide

  46. (c) 2021 Kouji Matsui
    札の正体
    ID覚えるの大変だし何かいい方法は? 名前つけてみる?
    .git
    6a28fb753eb4c9… b1ff9de048ca952… 663ca52f97b3ce87…
    c5da2b979d1156… “foobar”
    b1ff9de048ca952…
    “HEAD”
    c5da2b979d1156…
    何だか、HEADに
    似てる?

    View full-size slide

  47. (c) 2021 Kouji Matsui
    札の正体
    名前の札とHEAD札は、ほぼ同じ扱いです。
    これらの札の事を、「ブランチ」と呼びます。
    これで混乱した人は、多分SubversionやTFS(TFVC)を触ったこと
    があるかも知れません(すぐ説明します)。

    View full-size slide

  48. (c) 2021 Kouji Matsui
    札の正体
    名前の札は複数付けられるので:
    .git
    “foobar”
    b1ff9de048ca952…
    “HEAD”
    c5da2b979d1156…

    View full-size slide

  49. (c) 2021 Kouji Matsui
    札の正体
    ブランチが複数存在する状態:
    .git
    “foobar”
    b1ff9de048ca952…
    “HEAD”
    c5da2b979d1156…
    “main”
    594f2bacae342b7…
    “devel”
    993e92d68c31d25…
    “baz”
    993e92d68c31d25…

    View full-size slide

  50. (c) 2021 Kouji Matsui
    札の正体
    ブランチが複数存在する状態:
    .git
    “foobar”
    b1ff9de048ca952…
    末端のコミット
    でなくてもOK

    View full-size slide

  51. (c) 2021 Kouji Matsui
    札の正体
    ブランチが複数存在する状態:
    .git
    “devel”
    993e92d68c31d25…
    “baz”
    993e92d68c31d25…
    同じコミットを
    指していてもOK

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  56. (c) 2021 Kouji Matsui
    札の正体
    ブランチの真実: もし、札がこのように付いていれば:
    .git “main”
    594f2bacae342b7…
    “devel”
    993e92d68c31d25…
    という「分岐」が
    存在しているように見える…
    “foobar”
    cf1e5eb778ad6c9…

    View full-size slide

  57. (c) 2021 Kouji Matsui
    札の正体
    Gitのブランチは、札による「ツリーの様」を表していて、分
    岐構造を識別するものではありません。

    View full-size slide

  58. (c) 2021 Kouji Matsui
    札の正体
    コミットで動かない名前の札:「タグ」
    .git
    “release2157”
    c5da2b979d1156…
    “devel”
    c5da2b979d1156…
    コミット
    同じコミットを
    指しているブランチ
    同じコミットを
    指しているタグ

    View full-size slide

  59. (c) 2021 Kouji Matsui
    札の正体
    コミットで動かない名前の札:「タグ」
    .git
    “release2157”
    c5da2b979d1156…
    “devel”
    c5da2b979d1156…
    ブランチは移動するが
    タグは移動しない

    View full-size slide

  60. (c) 2021 Kouji Matsui
    札の正体
    HEADの真の姿:
    .git
    “HEAD”
    devel
    ブランチをチェックアウトすると
    HEADはブランチを指す
    “devel”
    c5da2b979d1156…
    コミット

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  63. (c) 2021 Kouji Matsui
    札の正体
    HEADの真の姿:
    .git
    “devel”
    c5da2b979d1156…
    “HEAD”
    devel
    HEADが指している
    ブランチが移動する
    “foobar”
    c5da2b979d1156…
    移動しない

    View full-size slide

  64. (c) 2021 Kouji Matsui
    札の正体
    札の種類についてのまとめ:
    ◦ ブランチは、コミットによって移動する。
    ◦ タグは、コミットによって移動しない。
    ◦ HEADは、現在のチェックアウトを保持する。
    → 札は、コミットIDやブランチを示すポインタでしかない。
    注意: 「札」はこの解説固有の呼称です。
    “main”
    “release2157”
    “HEAD”

    View full-size slide

  65. (c) 2021 Kouji Matsui
    札の正体
    以上から、少し前に話題になった件:
    ◦ ”main”または“master”という名称に、特別な意味はない。
    ◦ “master”を”main”に置き換え(変更)しても、Git上特に不都合はない。
    ◦ 何なら、“master”と”main”が同居しても良い。
    ◦ それどころか、”master”や”main”が存在しなくても問題ない。
    事もわかると思います。
    なお、“main”または”master”は、Gitのデフォルトのブランチ名
    です。
    “main” “master”
    VS

    View full-size slide

  66. (c) 2021 Kouji Matsui
    札の正体
    TIPS: グチャグチャになったら:
    .git
    “devel”
    ブランチが意図しないところに…

    View full-size slide

  67. (c) 2021 Kouji Matsui
    札の正体
    TIPS: グチャグチャになったら:
    .git
    “devel”
    git reset --hard で、強制的に
    指定したコミットIDに移動

    View full-size slide

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

    View full-size slide

  69. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    今まではローカルリポジトリでGitを使ってきました:
    .git
    1 2 3 4
    5 6
    7 8

    View full-size slide

  70. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    他の人のリポジトリとやり取りすると、共同作業できます:
    .git だれかの .git
    1 2 3
    9
    7
    5
    1 2 3 4
    5 6
    7 8

    View full-size slide

  71. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    コミットIDは、内容が同じなら同じID:
    .git だれかの .git
    1 2 3
    9
    7
    5
    1 2 3 4
    5 6
    7 8
    簡略化のため
    IDを連番で説明

    View full-size slide

  72. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    コミットIDは、内容が同じなら同じID:
    .git だれかの .git
    1 2 3
    9
    7
    5
    1 2 3 4
    5 6
    7 8
    同じコミットIDなら
    中身も同じ

    View full-size slide

  73. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    コミットIDは、内容が同じなら同じID:
    .git だれかの .git
    1 2 3
    9
    7
    5
    1 2 3 4
    5 6
    7 8
    相互に存在しない
    コミット

    View full-size slide

  74. (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

    View full-size slide

  75. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    もし、逆にfetchした場合:
    .git だれかの .git
    1 2 3 4
    5 6
    7 8
    存在しないコミット
    9
    1 2 3
    7
    4
    8
    5 6

    View full-size slide

  76. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    両者は同一になるはず。
    .git だれかの .git
    9
    1 2 3
    7
    4
    8
    5 6
    1 3 4
    5 6
    7 8
    2
    9

    View full-size slide

  77. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    “git fetch”コマンドを実行すると、相手から足りないコミット
    を取り込むことができる。
    ◦ データベースの同期機能(レプリケーション)のようなもの。
    片方向のみ(双方向ではない)。
    .gitディレクトリ内のデータが処理されるため、今手元で編集
    中のファイルやディレクトリには影響しない。

    View full-size slide

  78. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    つまり、勝手にマージされたりしない。
    札類は動かない。
    マージ操作は、常に手動によってのみ発生する
    (ので、安心していつでもfetchして良い)

    View full-size slide

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

    View full-size slide

  80. (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が転送され
    ブランチが移動

    View full-size slide

  81. (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”
    相手のブランチが
    勝手に変わるのは
    まずいのでは??

    View full-size slide

  82. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    普通は直接fetch/pushしたりしません(出来ません):
    .git だれかの.git
    fetch push

    View full-size slide

  83. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    リモートサーバー
    .git だれかの.git
    Gitサーバー
    サーバーを介します

    View full-size slide

  84. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    リモートサーバー
    .git だれかの.git
    .git
    Gitサーバーにも
    .gitディレクトリがある

    View full-size slide

  85. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    リモートサーバー
    .git
    .git
    つまり、こういう状態

    View full-size slide

  86. (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!

    View full-size slide

  87. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    リモートサーバー
    .git だれかの.git
    .git
    mainが移動

    View full-size slide

  88. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    リモートサーバー
    .git だれかの.git
    .git
    競合する??
    → ブランチの順方向移動ならOK
    mainが更に移動?

    View full-size slide

  89. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    ブランチの順方向の移動:
    .git Gitサーバー .git
    1 2 3 4
    5 6
    7 8
    9
    1 2 3
    7
    5
    “main” “main”
    push

    View full-size slide

  90. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    ブランチの順方向の移動:
    .git Gitサーバー .git
    1 2 3 4
    5 6
    7 8
    9
    1 2 3
    7
    5
    “main” “main”
    4
    順方向

    View full-size slide

  91. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    ブランチの順方向ではない移動:
    .git Gitサーバー .git
    1 2 3 4
    5 6
    7 8
    9
    1 2 3
    7
    5
    “main”
    “main”
    push

    View full-size slide

  92. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    ブランチの順方向ではない移動:
    .git Gitサーバー .git
    1 2 3 4
    5 6
    7 8
    9
    1 2 3
    7
    5
    “main”
    4
    “main”
    順方向ではない

    View full-size slide

  93. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    順方向の移動であれば、最新のブランチをpushできる。
    ◦ 順方向とは、より新しいコミット(小孫)方向。
    順方向ではない場合は、push時にエラーになる。
    ◦ 親方向への移動を行った。
    ◦ まったく関係のないコミットに移動している。
    そんなことあるの?
    ◦ 例: git reset --hardで逆方向に移動したブランチ
    ◦ 例: 誰かがマージしたために、ブランチが移動していた
    → 一旦fetchして、ローカルでマージしてからpush
    ◦ 例: リベースで新たなコミットIDを指すことになったブランチ

    View full-size slide

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

    View full-size slide

  95. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    GitのGUIクライアントには
    定期的にfetchする機能があります
    ツリー表示は勝手に更新されます。
    ブランチやタグは動きません!

    View full-size slide

  96. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    リモートサーバーの特定
    .git
    Gitサーバー .git
    https://github.com/kekyo/...
    長い…

    View full-size slide

  97. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    リモートサーバーの特定
    .git
    .git
    “origin”という名前を付ける
    “git remote add origin https://github.com/kekyo/...”

    View full-size slide

  98. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    リモートサーバーの特定
    .git
    .git リモートサーバーは
    いくつでも追加できる
    .git
    .git

    View full-size slide

  99. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    リモートサーバーの特定
    .git
    .git
    neko .git
    .git
    “git fetch origin”
    → originからfetchする

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  102. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    複数のリモートリポジトリ
    .git .git
    .git
    他の人が同じ名前を付けて
    いるとは限らない

    View full-size slide

  103. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    複数のリモートリポジトリ
    .git .git
    .git .git

    View full-size slide

  104. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    複数のリモートリポジトリ
    .git .git
    .git .git

    View full-size slide

  105. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    複数のリモートリポジトリ
    .git .git
    .git .git

    View full-size slide

  106. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    .git .git
    .git .git

    View full-size slide

  107. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    .git .git
    .git .git

    View full-size slide

  108. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    .git だれかの.git
    .git .git

    View full-size slide

  109. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    .git だれかの.git
    .git .git
    自分の作業用リポジトリを持ちつつ
    他のリポジトリにfetch/pushしたり出来ます

    View full-size slide

  110. (c) 2021 Kouji Matsui
    みんなで開発をやりたい
    複数のリモートリポジトリが
    合成されて表示されます

    View full-size slide

  111. (c) 2021 Kouji Matsui
    第二部へ続く…
    素材: いらすとや さん
    素材: Vincent Le Moignさん他 (CC-BY)

    View full-size slide