Git 道場 心:Git総論、心構え
-
Upload
nobuhiro-iwamatsu -
Category
Documents
-
view
850 -
download
2
description
Transcript of Git 道場 心:Git総論、心構え
自己紹介
● 岩松 信洋です。● Twitter は @iwamatsu です。● Gitによるバージョン管理 著者の一人です。● 普段はLinuxカーネルの開発とか、Debian というOSの開発をしています。
● 師範らしいです。
はじめに
● ようこそ!Git道場へ。● 今日Git道場の門を叩いた方
● 今のブームはGitらしい→使えるとモテるかも!?– 「彼がmergeやrebaseができなかった。別れたい。」
● Subversion派やCVS派から足を洗いたいが、merge / rebase がよくわからない。– Git道場は他の流派も受け入れる心が広い道場。
はじめに
● 講義・実技訓練の前に不安があるかも?● 今までの知識で実技訓練に望めるのか?● 俺はGit を選んでいいのだろうか....?
– よいです。正解。大正解。
● そんな方々に安心してGitを使えるように心構えを簡単に説明します。
Git は分散
Gitは分散
● Gitは中央管理用リポジトリを必要としないバージョン管理システム。分散バージョン管理システム。
● 今までは中央管理用リポジトリを必要とする Subversion などが主流だった。
● Gitにはリモートリポジトリとローカルリポジトリがある。
ワーキングコピー ワーキングコピー
リポジトリ
集中型の場合
・チェックアウト・アップデート・履歴の参照・履歴差分の確認
・コミット
リモートリポジトリ
ローカルリポジトリ
分散型(Git)の場合
ワーキングコピーワーキングコピー
プル プッシュ
コミット
プッシュ
コミット
チェックアウトチェックアウト
・履歴の参照・履歴差分の確認
リモートリポジトリ
ローカルリポジトリ
分散型(Git)の場合
ワーキングコピーワーキングコピー
プル プッシュ
コミット
プッシュ
コミット
チェックアウトチェックアウト
・履歴の参照・履歴差分の確認
プル
プル
集中型の場合
● ローカルリポジトリとリモートリポジトリの区別がない。
● リポジトリ● 共有するバージョン管理用のデータが格納されている。
● 履歴の参照、履歴差分の確認、コミットなどを行う場合、リポジトリへアクセスが必要
●分散型(Git)の場合● リモートリポジトリとローカルリポジトリがある。● 主な作業はローカルリポジトリで行う。
● コミット、ブランチの作成、マージ etc...
● 自分に必要な管理データをローカルリポジトリで管理できる。● リモートリポジトリにアクセスできなくても作業ができる。● 必要なデータがローカルにあるので動作が早い。
● プッシュでローカルリポジトリからリモートリポジトリに反映して初めて、他のユーザと履歴共有する。
● リモートリポジトリ● 共有するバージョン管理用のデータが格納されている。
● ローカルリポジトリ● リモートリポジトリのデータと自分の行ったバージョン管理用のデータが格納されている。
● ローカルリポジトリは俺のもの、リモートリポジトリはみんなのもの。
Gitで操作した時、各リポジトリがどのように変化するのか
リモートリポジトリをクローン
git clone test.git
リモートリポジトリ(test.git)
1 2 master
HEAD
リモートリポジトリをクローン
1 2
master
origin/master
git clone test.git
リモートリポジトリ(test.git)
HEAD
1 2 master
HEAD
ローカルリポジトリ
変更してコミット(A)
1 2
master
origin/master
edit ; git commt -sm “Add commit A”
リモートリポジトリ(test.git)
HEAD
1 2 master
HEAD
ローカルリポジトリ
変更してコミット(A)
1 2
A master
origin/master
edit ; git commt -sm “Add commit A”
リモートリポジトリ(test.git)
HEAD
1 2 master
HEAD
ローカルリポジトリ
コミット2からtestブランチを作成してチェックアウト
1 2
A master
origin/master
git checkout -b test commit-2
リモートリポジトリ(test.git)
HEAD
1 2 master
HEAD
ローカルリポジトリ
コミット2からtestブランチを作成してチェックアウト
1 2
A master
origin/master
git checkout -b test commit-2
リモートリポジトリ(test.git)
HEAD
1 2 master
HEAD
ローカルリポジトリ
test
変更してコミット(B)
1 2
A master
origin/master
edit ; git commit -am “Add commit B”
リモートリポジトリ(test.git)
HEAD
1 2 master
HEAD
ローカルリポジトリ
test
変更してコミット(B)
1 2
A master
origin/master
edit ; git commit -am “Add commit B”
リモートリポジトリ(test.git)
HEAD
1 2 master
HEAD
ローカルリポジトリ
testB
masterブランチをチェックアウト
1 2
A master
origin/master
git checkout masterHEAD
ローカルリポジトリ
testB
リモートリポジトリ(test.git)
1 2 master
HEAD
masterブランチをチェックアウト
1 2
A master
origin/master
git checkout masterHEAD
ローカルリポジトリ
B test
リモートリポジトリ(test.git)
1 2 master
HEAD
testブランチを削除
git branch -D test
1 2
A master
origin/master
HEAD
ローカルリポジトリ
B test
リモートリポジトリ(test.git)
1 2 master
HEAD
testブランチを削除
git branch -D test
1 2
A master
origin/master
HEAD
ローカルリポジトリ
B
リモートリポジトリ(test.git)
1 2 master
HEAD
変更してコミット(C)
edit ; git commit -am “Add commit C”
1 2
A master
origin/master
HEAD
ローカルリポジトリ
B
リモートリポジトリ(test.git)
1 2 master
HEAD
変更してコミット(C)
1 2
A master
origin/master
edit ; git commit -am “Add commit C”
リモートリポジトリ(test.git)
HEAD
1 2 master
HEAD
ローカルリポジトリ
B
C
作業している間に誰かコミットをプッシュした
リモートリポジトリ(test.git)
1 2 master
HEAD
1 2
A master
origin/master
HEAD
ローカルリポジトリ
B
C
作業している間に誰かコミットをプッシュした
1 2
A master
origin/master
リモートリポジトリ(test.git)
HEAD
1 2 master
HEAD
ローカルリポジトリ
3 B
C
作業している間に誰かコミットをプッシュした
1 2
A master
origin/master
リモートリポジトリ(test.git)
HEAD
1 2 master
HEAD
ローカルリポジトリ
3 B
C
この後は どうするの?rebase ? merge?小川師範の講義で説明します。
Git は分散
● コミットしてもローカルリポジトリにしか影響はない。
● プッシュするまでローカルリポジトリの情報はリモートリポジトリに反映されない。
● コミットしたからといって他の人に影響が出るわけでもないので、気にせずにコミットしましょう。
● ローカルリポジトリは俺のもの、リモートリポジトリはみんなのもの。
Git は頑健
Git は頑健● Gitは乱暴に言うとスナップショット。
● コミットすると全体のツリー構造と内容を保存する。
● これらは SHA1 ハッシュで管理されている。● コミット ← ツリー構造 ← 実際のファイル
– どれかが変更されると、ハッシュ値が変更される。
コミット :コミット
T :ツリー情報
F :ファイル
コミット1
F1 T2
T1
F2
ディレクトリT2にFile3を作成し、コミットする
コミット1
F1 T2
T1
F2
コミット1
F1 T2
T1
F2 F3
ディレクトリT2にFile3を作成し、コミットする
コミット1
F1 T2
T1
F2 F3
ディレクトリT2にFile3を作成し、コミットする
T2'
コミット1
F1 T2
T1
F2 F3
ディレクトリT2にFile3を作成し、コミットする
T2'
T1'
コミット1
F1 T2
T1
F2 F3
ディレクトリT2にFile3を作成し、コミットする
T2'
T1'
コミット2
コミット1
F1 T2
T1
F2 F3
File1を編集し、コミットする
T2'
T1'
コミット2
コミット1
F1 T2
T1
F2 F3
File1を編集し、コミットする
T2'
T1'
コミット2
F1'
コミット1
F1 T2
T1
F2 F3
File1を編集し、コミットする
T2'
T1'
コミット2
F1'
コミット1
F1 T2
T1
F2 F3
File1を編集し、コミットする
T2'
T1'
コミット2
F1'
T1'T1''
コミット1
F1 T2
T1
F2 F3
File1を編集し、コミットする
T2'
T1'
コミット2
F1'
T1'T1''
コミット3
Git は頑健● Gitは乱暴に言うとスナップショット。
● コミットすると全体のツリー構造と内容を保存する。
● これらは SHA1 ハッシュで管理されている。● コミット ← ツリー構造 ← 実際のファイル● コミットは前のコミットのハッシュ値を持つ。● 最新のコミットのハッシュ値は、過去の履歴すべてのコミット、ツリー、ファイルのハッシュを確認していることになる。
Git は頑健● 意図的に衝突を起こそうとしていない限り、正しいコミットハッシュが分かれば、それはツリーの構造、およびそのツリーに含まれているファイルの中身のハッシュ、および過去からその状態に至るまですべての履歴の状態を反映したハッシュ値になる。
● ファイルの中身が一つでも違う値であれば異なるハッシュ値になる。
Gitは時間的な変遷を管理する
Gitは時間的な変遷を管理する
● このコミットの前はどうなってのか● 前日のこの時間にした作業はどのような作業を行なっていたのか
● Gitはこれらを管理し、その状態に戻すことができる。
Gitは時間的な変遷を管理する
● Gitの作業履歴が残っている。
1 2
A master
origin/master
HEAD
ローカルリポジトリ
B test
リモートリポジトリ(test.git)
1 2 master
HEAD
testブランチを削除
git branch -D test
1 2
A master
origin/master
HEAD
ローカルリポジトリ
B test
リモートリポジトリ(test.git)
1 2 master
HEAD
testブランチを削除
git branch -D test
1 2
A master
origin/master
HEAD
ローカルリポジトリ
B
リモートリポジトリ(test.git)
1 2 master
HEAD
変更してコミット(C)
edit ; git commit -am “Add commit C”
1 2
A master
origin/master
HEAD
ローカルリポジトリ
B
リモートリポジトリ(test.git)
1 2 master
HEAD
変更してコミット(C)
1 2
A master
origin/master
edit ; git commit -am “Add commit C”
リモートリポジトリ(test.git)
HEAD
1 2 master
HEAD
ローカルリポジトリ
B
C
変更してコミット(C)
1 2
A master
origin/master
edit ; git commit -am “Add commit C”
リモートリポジトリ(test.git)
HEAD
1 2 master
HEAD
ローカルリポジトリ
B
C
やっぱりコミットBが必要だった....
Gitは時間的な変遷を管理する
● Gitの作業履歴が残っている。● git reflog で過去の作業履歴を参照できる。
$ 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
Gitは時間的な変遷を管理する
● Gitの作業履歴が残っている。● git reflog で過去の作業履歴を参照できる。
● ただし90日以内又はgit gcを実行しない/されない場合。● 不安ならGCを無効にする。
– git config --global gc.auto 0
● 全てコミットしましょう。– ローカルリポジトリ内で完結するので他の利用者には影響はない。
– コミットしていれば救われる。
まとめ
● Gitは分散● 作業はローカルリポジトリで管理される。● リモートリポジトリへの影響はあまり気にしない。
● Gitは頑健● Gitは時間的な変遷を管理する
● コミットしていれば、過去を取り戻せる(こともある)。
● コミットしていれば、失敗は怖くない。
質問
なにか質問はありますか?