Slide 1

Slide 1 text

1 39 Gitの仕組みと用語 慶應義塾大学理工学部物理情報工学科 渡辺 物理情報工学ソフトウェア開発演習

Slide 2

Slide 2 text

2 39 Gitは簡単ではない

Slide 3

Slide 3 text

3 39 git init git add git commit git status git diff git log git clone git remote git fetch git switch git merge git rebase ローカルリポジトリの操作 ブランチの操作 状態や歴史の確認 リモートとのやりとり 「とりあえず」でも こんなにある

Slide 4

Slide 4 text

4 39 --abbrev-commit --abbrev[=] --after= --all --all-match --alternate-refs --ancestry-path --anchored= --author-date-order --author= --basic-regexp --before= --binary --bisect --boundary --branches[=] --break-rewrites[=[][/]] --cc --check --cherry --cherry-mark --cherry-pick --children --color-moved-ws= --color-moved[=] --color-words[=] --color[=] --combined-all-paths --committer= --compact-summary --cumulative --date-order --date= --decorate-refs- exclude= --decorate-refs= --decorate[=short|full|auto|no] --dense --dense --diff-merges=[options] --dirstat-by-file[=…​] --dirstat[=] --do-walk --dst-prefix= --encoding= --exclude= --expand-tabs= --ext-diff --extended-regexp --find-copies-harder --find-copies[=] --find-object= --find-renames[=] --first-parent --fixed-strings --follow --format= --full-diff --full-history --full-index --function-context --glob= --graph --grep-reflog= --grep= --histogram --ignore-all-space --ignore-blank-lines --ignore-cr-at-eol --ignore-matching-lines= --ignore-missing --ignore-space-at-eol --ignore-space-change --ignore-submodules[=] --indent-heuristic --inter-hunk-context= --invert-grep --irreversible-delete --ita-invisible-in-index --left-only --left-right --line-prefix= --log-size --max-count= --max-parents= --merge --merges --min-parents= --minimal --name-only --name-status --not --notes[=] --numstat --oneline --output-indicator-context= --output-indicator-new= --output-indicator-old= --output= --parents --patch --patch-with-raw --patch-with-stat --patience --perl-regexp --pickaxe-all --pickaxe-regex --pretty[=] --raw --reflog --regexp-ignore-case --relative-date --relative[=] --remotes[=] --remove-empty --reverse --right-only --rotate-to= --shortstat --show-linear-break[=] --show-notes[=] --show-pulls --show-pulls --show-signature --simplify-by-decoration --simplify-merges --since= --single-worktree --skip-to= --skip= --source --sparse --src-prefix= --stat[=[,[,]]] --stdin --submodule[=] --summary --tags[=] --text --textconv --topo-order --unified= --until= --walk-reflogs --word-diff-regex= --word-diff[=] --ws-error-highlight=

Slide 5

Slide 5 text

5 39 Gitは簡単ではない Gitにはコマンドが多い Gitはユニークな設計思想を持つ Gitは使い方の自由度が高い(人によって流儀が異なる) Gitに慣れていないとトラブルへの対処が難しい

Slide 6

Slide 6 text

6 39 Gitで使われる用語を一通り学ぶ 「コミット」や「ブランチ」など、バージョン管理 システムでは共通の単語が使われるが、ツールに よって意味や用法がかなり異なる 以下の説明はGitでの説明であることに注意

Slide 7

Slide 7 text

7 39 卒論プロジェクト grad fig ref doc 管理したいファイルやフォルダの集まりを「プロジェクト」と呼ぶ 以後、必要なファイルを全て含むトップレベルフォルダをプロジェクトと同一視する

Slide 8

Slide 8 text

8 39 リポジトリ ワーキングツリー .git Git管理下にあるプロジェクト Gitで管理されたプロジェクトには.gitというフォルダがある リポジトリ:履歴や状態を保存する場所 ワーキングツリー:作業中のファイルやフォルダ プロジェクト一つにリポジトリ一つ

Slide 9

Slide 9 text

9 39 .git .git 自分のPC サーバ ローカルリポジトリ リモートリポジトリ (ノンベアリポジトリ) (ベアリポジトリ)

Slide 10

Slide 10 text

10 39 ローカルリポジトリ (local repository) 手元のPCにあるリポジトリのこと ワーキングツリーを持つ リモートリポジトリ (remote repository) リモート(ネットワークの向こう側)にある ワーキングツリーを持たない ベアリポジトリ (bare repository) ワーキングツリーを持たないリポジトリ 一般にリモートはベアリポジトリ

Slide 11

Slide 11 text

11 39 スナップショット(snapshot) ある時点でのプロジェクト全体の状態 Gitにある時点でのスナップショットを登録すること またはそのスナップショットそのもの コミット (commit)

Slide 12

Slide 12 text

12 39 Gitでは「歴史」を丸と線で表現する • 丸:ある時点の「状態」 • 線:二つの状態の関係(差分) 三日前 二日前 昨日 歴史 昨日から修正を加えたプロジェクト (スナップショット)

Slide 13

Slide 13 text

13 39 コミット:現在の状態を保存して「歴史」に加える 三日前 二日前 昨日 コミット 歴史 (スナップショット) 昨日から修正を加えたプロジェクト (スナップショット)

Slide 14

Slide 14 text

14 39 三日前 二日前 昨日 歴史 今日 この玉それぞれを「コミット」と呼ぶ この玉を新たに作る作業を「コミットする」と呼ぶ commit (名詞) : Gitの歴史のある「点」(スナップショット) commit (動詞): Gitの歴史に新たにスナップショットを付け加えること https://git-scm.com/docs/gitglossary A Git Glossary

Slide 15

Slide 15 text

15 39 歴史上の任意の地点に戻ることができる 今日の状態 二日前の状態 今日 昨日 二日前 三日前 今日 昨日 二日前 三日前 ワーキングツリー コミットはセーブファイルのようなもの

Slide 16

Slide 16 text

16 39 歴史上の任意の地点を比較できる 今日 昨日 二日前 三日前 デバッグに極めて有用

Slide 17

Slide 17 text

17 39 Gitには三種類の場所がある ワーキングツリー(workingtree) 現在修正中のプロジェクトファイルがある場所 インデックス (index) ステージングをする場所 コミットするスナップショットを用意する リポジトリ (repository) 歴史(コミット)を保存する場所

Slide 18

Slide 18 text

18 39 本番環境に反映させる前に準備をする場所 ローカルPCで修正 ステージング環境 本番環境 ローカルPC ここで動作テスト 本番環境へ反映 ステージング環境 ステージング環境に修正を反映すること ステージング

Slide 19

Slide 19 text

19 39 ワーキングツリー インデックス リポジトリ file1 file2 まだGit管理下に 置かれていない Gitの初期化直後

Slide 20

Slide 20 text

20 39 ワーキングツリー インデックス リポジトリ file1 file2 ステージング file1 file2 ワーキングツリーの状態(スナップショット)をインデックスに登録

Slide 21

Slide 21 text

21 39 ワーキングツリー インデックス リポジトリ file1 file2 コミット file1 file2 インデックスにステージングされた状態をリポジトリに登録 file1 file2

Slide 22

Slide 22 text

22 39 Q: なぜインデックスがあるの? A: 複数の修正がある時、一部の修正 を選んでコミットを作るため

Slide 23

Slide 23 text

23 39 file1 file2 file1 file2 最後にコミットした状態からfile1とfile2を修正した ワーキングツリー インデックス リポジトリ file1 file2

Slide 24

Slide 24 text

24 39 file1 file2 file1 file2 file1だけステージングする ワーキングツリー インデックス リポジトリ file1 file2

Slide 25

Slide 25 text

25 39 file1 file2 file1 file2 コミットする ワーキングツリー インデックス リポジトリ file1 file2

Slide 26

Slide 26 text

26 39 file1 file2 file1 file2 file2も同様にステージング、コミットする ワーキングツリー インデックス リポジトリ file1 file2

Slide 27

Slide 27 text

27 39 file1 file2 file1 file2 file1 file2 こんな歴史ができあがった file1とfile2を追加 file1を修正 file2を修正 Gitでは積極的に歴史を作成、改変する

Slide 28

Slide 28 text

28 39 Gitでは歴史を積極的に改変する Gitでは歴史が分岐することがある Gitにおいて歴史操作の手段として使うのがブランチ

Slide 29

Slide 29 text

29 39 初期化直後 最初のコミット main main 次のコミット main さらに次のコミット main ブランチ (branch) コミットにつくラベルのようなもの デフォルトでmainというブランチが用意される 自由に作ることができる コミットされると一緒に動く

Slide 30

Slide 30 text

30 39 main branch ブランチ作成直後 main branch HEAD ブランチの切り替え main branch HEAD コミット HEAD カレントブランチ (current branch) 「今見ているブランチ」のこと HEADというラベルが指す コミットにより動くのはカレントブランチのみ

Slide 31

Slide 31 text

31 39 main branch branchを 見ている状態 HEAD main branch mainに 切り替える HEAD main branch コミットする HEAD ブランチを切り替えながらコミットをすると 一般に歴史が分岐する

Slide 32

Slide 32 text

32 39 main HEAD 通常の状態 main HEAD detached HEAD状態 HEADがブランチを経由して コミットを指している HEADがブランチから外れ コミットを直接指している 通常、HEADはブランチを指しているが、HEADが直接 コミットを指す状態を頭が取れた(detached HEAD)状態 と呼ぶ

Slide 33

Slide 33 text

33 39 Gitでは、原則としてデフォルトブランチ(main)で作業しない 別のブランチで作業し、作業が一段落したらmainに取り込む この取り込む作業をマージと呼ぶ マージ(merge) あるブランチの修正を、別のブランチに取り込むこと

Slide 34

Slide 34 text

34 39 main branch mainの スナップショット branchの スナップショット main branch ファイル追加 mainからbranchへ更新する ための「差分」 玉:スナップショット 線:スナップショット間の差分

Slide 35

Slide 35 text

35 39 main = + コミット (スナップショット) 修正(パッチ) branch ファイル追加 次のコミット (スナップショット) main branch スナップショット(玉)に、パッチ(線)を適用すると、次のスナップショット(玉)になる

Slide 36

Slide 36 text

36 39 main branch main branch 修正を取り込みたいブランチが、もう一方のブ ランチの直接の祖先である場合、ブランチを移 動するだけでマージが完了する これをFast-forwardマージ(早送りマージ)と呼ぶ

Slide 37

Slide 37 text

37 39 main branch main branch 歴史が分岐している場合、マージにより歴史が 合流する HEAD HEAD 新たに作られるコミットをマージコミット(merge commit)と呼ぶ

Slide 38

Slide 38 text

38 39 main branch main branch Fast Forwardマージできる場合でもマージコミットを作ることができる Fast forwardマージすると、マージ元がどこで分岐したかの情報が失われる main branch main branch

Slide 39

Slide 39 text

39 39 コミット(名詞):スナップショット コミット(動詞):スナップショットの登録 インデックス:コミットの前に修正を登録する場所 ステージング:インデックスに修正を登録すること ブランチ:コミットについたラベル マージ:二つのブランチの修正を一つにまとめること Gitの歴史は「丸」と「線」で表現する 「丸」がスナップショット、「線」が差分を表す 今日ここだけは覚えて欲しい