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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

(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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

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

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

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

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

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

Slide 97

Slide 97 text

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

Slide 98

Slide 98 text

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

Slide 99

Slide 99 text

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

Slide 100

Slide 100 text

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

Slide 101

Slide 101 text

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

Slide 102

Slide 102 text

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

Slide 103

Slide 103 text

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

Slide 104

Slide 104 text

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

Slide 105

Slide 105 text

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

Slide 106

Slide 106 text

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

Slide 107

Slide 107 text

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

Slide 108

Slide 108 text

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

Slide 109

Slide 109 text

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

Slide 110

Slide 110 text

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

Slide 111

Slide 111 text

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