git 道場 心:git総論、心構え

60
Git 道場 心:Git総論、心構え Nobuhiro Iwamatsu E-Mail: [email protected] Twitter: @iwamatsu

Upload: nobuhiro-iwamatsu

Post on 18-Dec-2014

853 views

Category:

Documents


2 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Git 道場 心:Git総論、心構え

Git 道場

心:Git総論、心構えNobuhiro Iwamatsu

E-Mail: [email protected]: @iwamatsu

Page 2: Git 道場 心:Git総論、心構え

自己紹介

● 岩松 信洋です。● Twitter は @iwamatsu です。● Gitによるバージョン管理 著者の一人です。● 普段はLinuxカーネルの開発とか、Debian というOSの開発をしています。

● 師範らしいです。

Page 3: Git 道場 心:Git総論、心構え

はじめに

● ようこそ!Git道場へ。● 今日Git道場の門を叩いた方

● 今のブームはGitらしい→使えるとモテるかも!?– 「彼がmergeやrebaseができなかった。別れたい。」

● Subversion派やCVS派から足を洗いたいが、merge / rebase がよくわからない。– Git道場は他の流派も受け入れる心が広い道場。

Page 4: Git 道場 心:Git総論、心構え

はじめに

● 講義・実技訓練の前に不安があるかも?● 今までの知識で実技訓練に望めるのか?● 俺はGit を選んでいいのだろうか....?

– よいです。正解。大正解。

● そんな方々に安心してGitを使えるように心構えを簡単に説明します。

Page 5: Git 道場 心:Git総論、心構え

Git は分散

Page 6: Git 道場 心:Git総論、心構え

Gitは分散

● Gitは中央管理用リポジトリを必要としないバージョン管理システム。分散バージョン管理システム。

● 今までは中央管理用リポジトリを必要とする Subversion などが主流だった。

● Gitにはリモートリポジトリとローカルリポジトリがある。

Page 7: Git 道場 心:Git総論、心構え

ワーキングコピー ワーキングコピー

リポジトリ

集中型の場合

・チェックアウト・アップデート・履歴の参照・履歴差分の確認

・コミット

Page 8: Git 道場 心:Git総論、心構え

リモートリポジトリ

ローカルリポジトリ

分散型(Git)の場合

ワーキングコピーワーキングコピー

プル プッシュ

コミット

プッシュ

コミット

チェックアウトチェックアウト

・履歴の参照・履歴差分の確認

Page 9: Git 道場 心:Git総論、心構え

リモートリポジトリ

ローカルリポジトリ

分散型(Git)の場合

ワーキングコピーワーキングコピー

プル プッシュ

コミット

プッシュ

コミット

チェックアウトチェックアウト

・履歴の参照・履歴差分の確認

プル

プル

Page 10: Git 道場 心:Git総論、心構え

集中型の場合

● ローカルリポジトリとリモートリポジトリの区別がない。

● リポジトリ● 共有するバージョン管理用のデータが格納されている。

● 履歴の参照、履歴差分の確認、コミットなどを行う場合、リポジトリへアクセスが必要

Page 11: Git 道場 心:Git総論、心構え

●分散型(Git)の場合● リモートリポジトリとローカルリポジトリがある。● 主な作業はローカルリポジトリで行う。

● コミット、ブランチの作成、マージ etc...

● 自分に必要な管理データをローカルリポジトリで管理できる。● リモートリポジトリにアクセスできなくても作業ができる。● 必要なデータがローカルにあるので動作が早い。

● プッシュでローカルリポジトリからリモートリポジトリに反映して初めて、他のユーザと履歴共有する。

Page 12: Git 道場 心:Git総論、心構え

● リモートリポジトリ● 共有するバージョン管理用のデータが格納されている。

● ローカルリポジトリ● リモートリポジトリのデータと自分の行ったバージョン管理用のデータが格納されている。

● ローカルリポジトリは俺のもの、リモートリポジトリはみんなのもの。

Page 13: Git 道場 心:Git総論、心構え

Gitで操作した時、各リポジトリがどのように変化するのか

Page 14: Git 道場 心:Git総論、心構え

リモートリポジトリをクローン

git clone test.git

リモートリポジトリ(test.git)

1 2 master

HEAD

Page 15: Git 道場 心:Git総論、心構え

リモートリポジトリをクローン

1 2

master

origin/master

git clone test.git

リモートリポジトリ(test.git)

HEAD

1 2 master

HEAD

ローカルリポジトリ

Page 16: Git 道場 心:Git総論、心構え

変更してコミット(A)

1 2

master

origin/master

edit ; git commt -sm “Add commit A”

リモートリポジトリ(test.git)

HEAD

1 2 master

HEAD

ローカルリポジトリ

Page 17: Git 道場 心:Git総論、心構え

変更してコミット(A)

1 2

A master

origin/master

edit ; git commt -sm “Add commit A”

リモートリポジトリ(test.git)

HEAD

1 2 master

HEAD

ローカルリポジトリ

Page 18: Git 道場 心:Git総論、心構え

コミット2からtestブランチを作成してチェックアウト

1 2

A master

origin/master

git checkout -b test commit-2

リモートリポジトリ(test.git)

HEAD

1 2 master

HEAD

ローカルリポジトリ

Page 19: Git 道場 心:Git総論、心構え

コミット2からtestブランチを作成してチェックアウト

1 2

A master

origin/master

git checkout -b test commit-2

リモートリポジトリ(test.git)

HEAD

1 2 master

HEAD

ローカルリポジトリ

test

Page 20: Git 道場 心:Git総論、心構え

変更してコミット(B)

1 2

A master

origin/master

edit ; git commit -am “Add commit B”

リモートリポジトリ(test.git)

HEAD

1 2 master

HEAD

ローカルリポジトリ

test

Page 21: Git 道場 心:Git総論、心構え

変更してコミット(B)

1 2

A master

origin/master

edit ; git commit -am “Add commit B”

リモートリポジトリ(test.git)

HEAD

1 2 master

HEAD

ローカルリポジトリ

testB

Page 22: Git 道場 心:Git総論、心構え

masterブランチをチェックアウト

1 2

A master

origin/master

git checkout masterHEAD

ローカルリポジトリ

testB

リモートリポジトリ(test.git)

1 2 master

HEAD

Page 23: Git 道場 心:Git総論、心構え

masterブランチをチェックアウト

1 2

A master

origin/master

git checkout masterHEAD

ローカルリポジトリ

B test

リモートリポジトリ(test.git)

1 2 master

HEAD

Page 24: Git 道場 心:Git総論、心構え

testブランチを削除

git branch -D test

1 2

A master

origin/master

HEAD

ローカルリポジトリ

B test

リモートリポジトリ(test.git)

1 2 master

HEAD

Page 25: Git 道場 心:Git総論、心構え

testブランチを削除

git branch -D test

1 2

A master

origin/master

HEAD

ローカルリポジトリ

B

リモートリポジトリ(test.git)

1 2 master

HEAD

Page 26: Git 道場 心:Git総論、心構え

変更してコミット(C)

edit ; git commit -am “Add commit C”

1 2

A master

origin/master

HEAD

ローカルリポジトリ

B

リモートリポジトリ(test.git)

1 2 master

HEAD

Page 27: Git 道場 心:Git総論、心構え

変更してコミット(C)

1 2

A master

origin/master

edit ; git commit -am “Add commit C”

リモートリポジトリ(test.git)

HEAD

1 2 master

HEAD

ローカルリポジトリ

B

C

Page 28: Git 道場 心:Git総論、心構え

作業している間に誰かコミットをプッシュした

リモートリポジトリ(test.git)

1 2 master

HEAD

1 2

A master

origin/master

HEAD

ローカルリポジトリ

B

C

Page 29: Git 道場 心:Git総論、心構え

作業している間に誰かコミットをプッシュした

1 2

A master

origin/master

リモートリポジトリ(test.git)

HEAD

1 2 master

HEAD

ローカルリポジトリ

3 B

C

Page 30: Git 道場 心:Git総論、心構え

作業している間に誰かコミットをプッシュした

1 2

A master

origin/master

リモートリポジトリ(test.git)

HEAD

1 2 master

HEAD

ローカルリポジトリ

3 B

C

この後は どうするの?rebase ? merge?小川師範の講義で説明します。

Page 31: Git 道場 心:Git総論、心構え

Git は分散

● コミットしてもローカルリポジトリにしか影響はない。

● プッシュするまでローカルリポジトリの情報はリモートリポジトリに反映されない。

● コミットしたからといって他の人に影響が出るわけでもないので、気にせずにコミットしましょう。

● ローカルリポジトリは俺のもの、リモートリポジトリはみんなのもの。

Page 32: Git 道場 心:Git総論、心構え

Git は頑健

Page 33: Git 道場 心:Git総論、心構え

Git は頑健● Gitは乱暴に言うとスナップショット。

● コミットすると全体のツリー構造と内容を保存する。

● これらは SHA1 ハッシュで管理されている。● コミット ← ツリー構造 ← 実際のファイル

– どれかが変更されると、ハッシュ値が変更される。

Page 34: Git 道場 心:Git総論、心構え

コミット :コミット

T :ツリー情報

F :ファイル

コミット1

F1 T2

T1

F2

Page 35: Git 道場 心:Git総論、心構え

ディレクトリT2にFile3を作成し、コミットする

コミット1

F1 T2

T1

F2

Page 36: Git 道場 心:Git総論、心構え

コミット1

F1 T2

T1

F2 F3

ディレクトリT2にFile3を作成し、コミットする

Page 37: Git 道場 心:Git総論、心構え

コミット1

F1 T2

T1

F2 F3

ディレクトリT2にFile3を作成し、コミットする

T2'

Page 38: Git 道場 心:Git総論、心構え

コミット1

F1 T2

T1

F2 F3

ディレクトリT2にFile3を作成し、コミットする

T2'

T1'

Page 39: Git 道場 心:Git総論、心構え

コミット1

F1 T2

T1

F2 F3

ディレクトリT2にFile3を作成し、コミットする

T2'

T1'

コミット2

Page 40: Git 道場 心:Git総論、心構え

コミット1

F1 T2

T1

F2 F3

File1を編集し、コミットする

T2'

T1'

コミット2

Page 41: Git 道場 心:Git総論、心構え

コミット1

F1 T2

T1

F2 F3

File1を編集し、コミットする

T2'

T1'

コミット2

F1'

Page 42: Git 道場 心:Git総論、心構え

コミット1

F1 T2

T1

F2 F3

File1を編集し、コミットする

T2'

T1'

コミット2

F1'

Page 43: Git 道場 心:Git総論、心構え

コミット1

F1 T2

T1

F2 F3

File1を編集し、コミットする

T2'

T1'

コミット2

F1'

T1'T1''

Page 44: Git 道場 心:Git総論、心構え

コミット1

F1 T2

T1

F2 F3

File1を編集し、コミットする

T2'

T1'

コミット2

F1'

T1'T1''

コミット3

Page 45: Git 道場 心:Git総論、心構え

Git は頑健● Gitは乱暴に言うとスナップショット。

● コミットすると全体のツリー構造と内容を保存する。

● これらは SHA1 ハッシュで管理されている。● コミット ← ツリー構造 ← 実際のファイル● コミットは前のコミットのハッシュ値を持つ。● 最新のコミットのハッシュ値は、過去の履歴すべてのコミット、ツリー、ファイルのハッシュを確認していることになる。

Page 46: Git 道場 心:Git総論、心構え

Git は頑健● 意図的に衝突を起こそうとしていない限り、正しいコミットハッシュが分かれば、それはツリーの構造、およびそのツリーに含まれているファイルの中身のハッシュ、および過去からその状態に至るまですべての履歴の状態を反映したハッシュ値になる。

● ファイルの中身が一つでも違う値であれば異なるハッシュ値になる。

Page 47: Git 道場 心:Git総論、心構え

Gitは時間的な変遷を管理する

Page 48: Git 道場 心:Git総論、心構え

Gitは時間的な変遷を管理する

● このコミットの前はどうなってのか● 前日のこの時間にした作業はどのような作業を行なっていたのか

● Gitはこれらを管理し、その状態に戻すことができる。

Page 49: Git 道場 心:Git総論、心構え

Gitは時間的な変遷を管理する

● Gitの作業履歴が残っている。

Page 50: Git 道場 心:Git総論、心構え

1 2

A master

origin/master

HEAD

ローカルリポジトリ

B test

リモートリポジトリ(test.git)

1 2 master

HEAD

Page 51: Git 道場 心:Git総論、心構え

testブランチを削除

git branch -D test

1 2

A master

origin/master

HEAD

ローカルリポジトリ

B test

リモートリポジトリ(test.git)

1 2 master

HEAD

Page 52: Git 道場 心:Git総論、心構え

testブランチを削除

git branch -D test

1 2

A master

origin/master

HEAD

ローカルリポジトリ

B

リモートリポジトリ(test.git)

1 2 master

HEAD

Page 53: Git 道場 心:Git総論、心構え

変更してコミット(C)

edit ; git commit -am “Add commit C”

1 2

A master

origin/master

HEAD

ローカルリポジトリ

B

リモートリポジトリ(test.git)

1 2 master

HEAD

Page 54: Git 道場 心:Git総論、心構え

変更してコミット(C)

1 2

A master

origin/master

edit ; git commit -am “Add commit C”

リモートリポジトリ(test.git)

HEAD

1 2 master

HEAD

ローカルリポジトリ

B

C

Page 55: Git 道場 心:Git総論、心構え

変更してコミット(C)

1 2

A master

origin/master

edit ; git commit -am “Add commit C”

リモートリポジトリ(test.git)

HEAD

1 2 master

HEAD

ローカルリポジトリ

B

C

やっぱりコミットBが必要だった....

Page 56: Git 道場 心:Git総論、心構え

Gitは時間的な変遷を管理する

● Gitの作業履歴が残っている。● git reflog で過去の作業履歴を参照できる。

Page 57: Git 道場 心:Git総論、心構え

$ git reflog4341590 HEAD@{0}: commit: Commit-Ce6703af HEAD@{1}: checkout: moving from test to master1b3e6dc HEAD@{2}: commit: Commit-B5b2ff15 HEAD@{3}: checkout: moving from master to teste6703af HEAD@{4}: commit: Commit-A5b2ff15 HEAD@{5}: clone: from /tmp/test.git

Page 58: Git 道場 心:Git総論、心構え

Gitは時間的な変遷を管理する

● Gitの作業履歴が残っている。● git reflog で過去の作業履歴を参照できる。

● ただし90日以内又はgit gcを実行しない/されない場合。● 不安ならGCを無効にする。

– git config --global gc.auto 0

● 全てコミットしましょう。– ローカルリポジトリ内で完結するので他の利用者には影響はない。

– コミットしていれば救われる。

Page 59: Git 道場 心:Git総論、心構え

まとめ

● Gitは分散● 作業はローカルリポジトリで管理される。● リモートリポジトリへの影響はあまり気にしない。

● Gitは頑健● Gitは時間的な変遷を管理する

● コミットしていれば、過去を取り戻せる(こともある)。

● コミットしていれば、失敗は怖くない。

Page 60: Git 道場 心:Git総論、心構え

質問

なにか質問はありますか?