Slide 1

Slide 1 text

Git入門 SecPrj Intro-phase

Slide 2

Slide 2 text

Gitとは Gitとは、オープンソースの分散バージョン管理システムの一つ。複数の 開発者が共同で一つのソフトウェアを開発する際などに、ソースコード やドキュメントなどの編集履歴を統一的に管理するのに用いられる。 Gitとは - IT用語辞典 e-Words https://e-words.jp/w/Git.html

Slide 3

Slide 3 text

ソフトウェアのバージョン管理 Gitがない世界 ファイル名 最終変更日 app.py 2021/03/01 app_ver2.py 2021/05/20 app_ver3.py 2021/05/10 app_latest.py 2021/06/02 app_latest2.py 2021/05/30 で,結局どれが 最新なんすか?

Slide 4

Slide 4 text

ソフトウェアのバージョン管理 Gitがない世界 Gitがある世界 ファイル名 最終変更日 app.py 2021/03/01 app_ver2.py 2021/05/20 app_ver3.py 2021/05/10 app_latest.py 2021/06/02 app_latest2.py 2021/05/30 で,結局どれが 最新なんすか? ファイル名 最終変更日 .git/ 2021/06/02 app.py 2021/06/02 変更履歴(コミットログ) 機能Bを実装 関数bを実装 機能Aを修正 関数aを実装 機能Aを実装 任意の変更点を 打ち消したり 戻したりできる

Slide 5

Slide 5 text

複数人での作業 Gitがない世界 ファイル名 変更点 app.py 機能A,B app_func1.py 機能A app_func2.py 機能B app_func1.py 機能A実装 app_func2.py 機能B実装 app_func1.py app.py app_func2.py A B A B 機能A,B統合

Slide 6

Slide 6 text

複数人での作業 Gitがない世界 Gitがある世界 ファイル名 変更点 app.py 機能A,B app_func1.py 機能A app_func2.py 機能B app_func1.py 機能A実装 ファイル名 変更点 .git/ -- app.py 機能A,B app_func2.py 機能B実装 app_func1.py app.py app_func2.py A B ブランチによる管理 main func1 func2 commit ブランチ merge A B 機能A,B統合

Slide 7

Slide 7 text

Gitの基本的な操作 - ステージング(add) - コミット(commit) - ステータス(status) - ブランチ(branch) - 移動(switch) - マージ(merge) - プッシュ(push) - プル(pull) - クローン(clone)

Slide 8

Slide 8 text

Gitでコミットする コミットツリー 未コミットの変更点A,B があるファイル群 ステージ A B

Slide 9

Slide 9 text

Gitでコミットする コミットツリー 未コミットの変更点A,B があるファイル群 ステージ A B A B ステージング

Slide 10

Slide 10 text

Gitでコミットする コミットツリー 未コミットの変更点A,B があるファイル群 ステージ A B コミット A B ステージング コミットするとGitに 変更が記録される (コミットオブジェクトの生成)

Slide 11

Slide 11 text

Gitのコミット(コミットオブジェクト) A2 A1 A3 コミットはスナップショット(その時点のディレクトリ/ファイルのコピー) コミットしたファイルと各種情報を持つオブジェクトがコミットオブジェクト

Slide 12

Slide 12 text

Gitのコミット(コミットオブジェクト) A2 A1 A3 コミット(コミットオブジェクト)にはそれぞれコミットハッシュとよばれる SHA1ハッシュ(40文字)が振られる コミットハッシュでコミット(コミットオブジェクト)を一意に指定できる 87e9293cefb2a50ba945 7f5c79553d74eeb360fc 5b9e980753180e96ab40 41cb43c507d86bfff3f6 66e5c0862066a1c0809a 5ff693a8123ea3f6e6e5

Slide 13

Slide 13 text

Gitにおけるファイルのステータス ファイルには4つの状態がある Untracked(追跡されてない)/Unmodified(変更なし)/ Modified(変更あり/ステージングされていない)/Staged(ステージングされている) Git - 変更内容のリポジトリへの記録 https://git-scm.com/book/ja/v2/Git-の基本-変更内容のリポジトリへの記録

Slide 14

Slide 14 text

Gitでブランチを使う a b コミット ブランチ c それぞれのコミット(変更)が 他のブランチに影響していない ブランチはいわば「世界線」。あるブランチは他ブランチの変更に影響されない ex) 関数Aを実装した世界線/関数Bを実装した世界線 実装する機能やバージョンごとにブランチを切るのが一般的

Slide 15

Slide 15 text

ブランチを 移動して作業 Gitでブランチを使う ブランチはいわば「世界線」。あるブランチは他ブランチの変更に影響されない ex) 関数Aを実装した世界線/関数Bを実装した世界線 実装する機能やバージョンごとにブランチを切るのが一般的 a b コミット ブランチ c それぞれのコミット(変更)が 他のブランチに影響していない

Slide 16

Slide 16 text

ブランチを 割振って作業 Gitでブランチを使う a b コミット ブランチ c それぞれのコミット(変更)が 他のブランチに影響していない ブランチはいわば「世界線」。あるブランチは他ブランチの変更に影響されない ex) 関数Aを実装した世界線/関数Bを実装した世界線 実装する機能やバージョンごとにブランチを切るのが一般的

Slide 17

Slide 17 text

実装する機能 によって分離 Gitでブランチを使う a b コミット ブランチ c それぞれのコミット(変更)が 他のブランチに影響していない ブランチはいわば「世界線」。あるブランチは他ブランチの変更に影響されない ex) 関数Aを実装した世界線/関数Bを実装した世界線 実装する機能やバージョンごとにブランチを切るのが一般的 A B

Slide 18

Slide 18 text

ブランチをマージする a b コミット マージ あるブランチの変更と別のブランチを統合/反映する 反映は基本自動で行われるが,変更の重複点のみコンフリクトを起こす コンフリクトは手動で解消する必要がある.

Slide 19

Slide 19 text

ブランチをマージする あるブランチの変更と別のブランチを統合/反映する 反映は基本自動で行われるが,変更の重複点のみコンフリクトを起こす コンフリクトは手動で解消する必要がある. a b コミット マージ 変更が重複すると コンフリクト

Slide 20

Slide 20 text

リポジトリ Git管理されているディレクトリをリポジトリ(repository)と呼ぶ ローカルリポジトリ - 手元(ローカル)にあるリポジトリ リモートリポジトリ - インターネット上などのサーバ上にあるリポジトリ リモートリポジトリ 開発者A 開発者B 複製/反映 複製/反映 変更 変更

Slide 21

Slide 21 text

リポジトリ Git管理されているディレクトリをリポジトリ(repository)と呼ぶ ローカルリポジトリ - 手元(ローカル)にあるリポジトリ リモートリポジトリ - インターネット上などのサーバ上にあるリポジトリ 複製がどこかにあればリモートリポジトリが死んでもある程度は復元可能 リモートリポジトリ 開発者A 開発者B 複製/反映 複製/反映 変更 変更

Slide 22

Slide 22 text

リポジトリ Git管理されているディレクトリをリポジトリ(repository)と呼ぶ ローカルリポジトリ - 手元(ローカル)にあるリポジトリ リモートリポジトリ - インターネット上などのサーバ上にあるリポジトリ GitHubやGitLabなどはリモートリポジトリの実装の1つ リモートリポジトリ 開発者A 開発者B 複製/反映 複製/反映 変更 変更

Slide 23

Slide 23 text

リモートリポジトリへの操作 リポジトリを複製(Clone) リモートリポジトリ clone ローカルの変更反映/リモートの変更反映 リモートリポジトリ pull push cloneはデフォルトで デフォルトブランチを複 製する push/pullは任意の ブランチに対して実行 (b1だけpush...など)

Slide 24

Slide 24 text

ハンズオン1 ローカルリポジトリを作成する

Slide 25

Slide 25 text

リポジトリを初期化する ディレクトリにあるファイルはそのままで, カレントディレクトリをGit管理下に置く .git/ が生成され,既にあるファイルは 追跡されていない未コミットファイルとなる $ git init $ git status

Slide 26

Slide 26 text

Gitでコミットする 未コミットの変更点A があるファイル ステージ A $ git diff コミットツリー Untrackedなファイルは差分表示されない

Slide 27

Slide 27 text

Gitでコミットする 未コミットの変更点A があるファイル ステージ A A ステージング $ git add コミットツリー

Slide 28

Slide 28 text

Gitでコミットする ユーザ情報の設定 コミットユーザの情報として利用される $ git config --global user.email “your email” $ git config --global user.name “your name” $ git config --global core.editor “nano”

Slide 29

Slide 29 text

Gitでコミットする 未コミットの変更点A があるファイル ステージ A コミット A $ git commit $ git commit -m “...” or コミットツリー ステージング

Slide 30

Slide 30 text

Gitでコミットする コミットツリー 未コミットの変更点A があるファイル ステージ A A コミット $ git log ステージング

Slide 31

Slide 31 text

Trackedなファイルであれば差分が表示される

Slide 32

Slide 32 text

Gitでブランチを使う master ブランチを確認する $ git branch

Slide 33

Slide 33 text

Gitでブランチを使う master b1 ブランチを作成する 作成したカレントブランチの情報を引き継ぐ $ git branch b1

Slide 34

Slide 34 text

Gitでブランチを使う master b1 カレントブランチを移動する master → b1 $ git switch b1 $ git switch -c b1 で作成&移動も可能

Slide 35

Slide 35 text

Gitでブランチを使う master b1 b1で何かを変更し、コミットする このコミットはmasterに続く形になる (b1はmasterから切られているので) $ git add $ git commit -任意の編集-

Slide 36

Slide 36 text

Gitでブランチを使う master b1 b1で何かを変更し、コミットする このコミットはmasterに続く形になる (b1はmasterから切られているので) $ git log

Slide 37

Slide 37 text

Gitでブランチを使う master b1 カレントブランチをmasterに移動 1つめのコミットしかみえない $ git switch master

Slide 38

Slide 38 text

Gitでブランチを使う master b1 b1ブランチをmasterブランチにマージ 変更がb1でコミットした変更が反映されている $ git merge b1

Slide 39

Slide 39 text

ハンズオン2 リモートリポジトリの作成/Clone/Push/Pull

Slide 40

Slide 40 text

リモートリポジトリのクローン,プッシュ,プル まず自分のGitHubページで新しいリポジトリを作る

Slide 41

Slide 41 text

リモートリポジトリのクローン,プッシュ,プル

Slide 42

Slide 42 text

最初のコミットがされた状態でリモートリポジトリが生成される リモートリポジトリのクローン,プッシュ,プル

Slide 43

Slide 43 text

$ git clone https://github.com/silmin/git-test.git リモートリポジトリのクローン,プッシュ,プル

Slide 44

Slide 44 text

リモートリポジトリのクローン,プッシュ,プル cloneしてきたリポジトリに変更点を加えて,コミットする

Slide 45

Slide 45 text

リモートリポジトリのクローン,プッシュ,プル

Slide 46

Slide 46 text

helloが追加されている $ git push origin main リモートリポジトリのクローン,プッシュ,プル

Slide 47

Slide 47 text

$ git push origin main リモートリポジトリ ブランチ

Slide 48

Slide 48 text

リモートリポジトリのクローン,プッシュ,プル WebUIから直接変更してみる

Slide 49

Slide 49 text

リモートリポジトリのクローン,プッシュ,プル リモートでの変更をローカルにプルして反映

Slide 50

Slide 50 text

ハンズオンおわり

Slide 51

Slide 51 text

gitconfigについて それぞれのリポジトリにはその設定ファイルとして .git/config がある 全てのリポジトリに適用されるグローバルな設定 ~/.gitconfig もある さっきGitHubで作った リポジトリの.git/config originはリモートリポジトリに つけられた名前

Slide 52

Slide 52 text

Gitのブランチ main ブランチポインタ カレントブランチ(HEAD) ブランチの実態はただのコミットへの参照(ポインタ) ブランチの数 ≒ ブランチポインタの数 ブランチのポインタは,それぞれ常にブランチの先頭コミットを参照している

Slide 53

Slide 53 text

Gitのブランチ temp main ブランチの実態はただのコミットへの参照(ポインタ) ブランチの数 ≒ ブランチポインタの数 ブランチのポインタは,それぞれ常にブランチの先頭コミットを参照している ブランチポインタ カレントブランチ(HEAD) $ git switch -c temp

Slide 54

Slide 54 text

Gitのブランチ temp main ブランチポインタ カレントブランチ(HEAD) $ git commit ... ブランチの実態はただのコミットへの参照(ポインタ) ブランチの数 ≒ ブランチポインタの数 ブランチのポインタは,それぞれ常にブランチの先頭コミットを参照している

Slide 55

Slide 55 text

Gitのブランチ temp main ブランチポインタ カレントブランチ(HEAD) $ git switch main ブランチの実態はただのコミットへの参照(ポインタ) ブランチの数 ≒ ブランチポインタの数 ブランチのポインタは,それぞれ常にブランチの先頭コミットを参照している

Slide 56

Slide 56 text

Gitのブランチ temp main ブランチポインタ カレントブランチ(HEAD) $ git commit ... ブランチの実態はただのコミットへの参照(ポインタ) ブランチの数 ≒ ブランチポインタの数 ブランチのポインタは,それぞれ常にブランチの先頭コミットを参照している

Slide 57

Slide 57 text

Gitのブランチ temp main ブランチポインタ カレントブランチ(HEAD) $ git merge temp ブランチの実態はただのコミットへの参照(ポインタ) ブランチの数 ≒ ブランチポインタの数 ブランチのポインタは,それぞれ常にブランチの先頭コミットを参照している

Slide 58

Slide 58 text

Gitのブランチ a 2 a 1 a 3 temp main b 1 a 4 a 5 ブランチポインタ カレントブランチ(HEAD) a 1 a 2 a 3 b 1 a 4 a 5 main temp