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
PRO

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 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 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 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 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 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 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 Slide

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

    View Slide

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

    View 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 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 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View 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 Slide

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

    View Slide

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

    View 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 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 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 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 Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide