scmbc git入門セッション発表資料

Post on 30-Jun-2015

9.846 Views

Category:

Technology

5 Downloads

Preview:

Click to see full reader

TRANSCRIPT

SCMBC Git 資料

第二回 SCMBC Git 班

Git のリポジトリ リポジトリ = データを貯めるところ

Git ではリポジトリがローカルにある SVN ではローカルにないことが多い ローカルのリポジトリに対する操作は高速 ( 通信不要 ) push, pull などを使って同期を取る ( 通信がここで発

生 )

手元のリポジトリではコンフリクトしない

SCMBC Git 資料

多人数開発 SVN では1リポジトリ複数ツリー

Figures from Pro Git http://progit.org/book/ja/ch5-1.htmlSCMBC Git 資料

Git では個人がリポジトリを持つ

多人数開発 共有リポジトリに pull, push をする 共有リポジトリは複数ある場合も

CI サーバとステージング用と、、、

Figures from Pro Git http://progit.org/book/ja/ch5-1.htmlSCMBC Git 資料

Git のオブジェクト

すべて Immutable 作成されたら破棄されないかぎり変更されない

Blob : ファイルの中身 Tree : ディレクトリ構成 Commit : コミット内容 ( Tag )

SCMBC Git 資料

Blob オブジェクト

ファイルの中身だけを表す

ファイル名などは Tree オブジェクトが保持

Tree や Commit をまたいで参照される このために Immutable になっている

差分ではなく、スナップショット

SCMBC Git 資料

Tree オブジェクト

ディレクトリ構成を表す 子ファイル 子ディレクトリ

同一のオブジェクトは複数のツリーから参照される ディスクの空間効率をよくするため

SCMBC Git 資料

//

aa tt

bb cc

実ファイルと Git オブジェクト

SCMBC Git 資料

Tree100644

25b351.. a40000

219852.. tTree

100644 989209.. b

100755 1b0938.. c

Blob11100101101

101

Blob10010101100

101

Blob00100110101

001

850fc9..

25b351.. 219852..

989209.. 1b0938..

Commit オブジェクト

コミット(リビジョンの記録) コミットした人、時間、メッセージ 親コミット ルート Tree …

親コミット 通常ひとつ マージした場合、複数 初回コミットにはない

親コミットを順にたどることで歴史がわかる

SCMBC Git 資料

コミットメッセージ

SCMBC Git 資料

普通に Git を使うとコミットメッセージは必須 空だとエラーになる

一行目に概要、二行目を空白にして、三行目以降に詳細 色々なコマンド ( 主にログ系 ) がこのフォーマット前提 詳細が不要な時は一行目だけ

コミットの様子

SCMBC Git 資料

//

aa tt

bb cc

git init

SCMBC Git 資料

//

aa tt

bb cc

.git

.git

git add .

SCMBC Git 資料

/

ta

b c

Tree オブジェクトやBlob オブジェクトが作られる

//

aa tt

bb cc

.git

.git

git commit

SCMBC Git 資料

/

ta

b c

A Commit オブジェクトが作られる

//

aa tt

bb cc

.git

.git

edit a; git add a; git commitedit a; git add a;edit a;

//

aa tt

bb cc

.git

.git

SCMBC Git 資料

A B

/ /

ta

b c

a’

//

tt

bb cc

.git

.git

a’新しいコミットオブジェクト

a を編集して a’ にした

t 以下はいじってないのでそのままのものが使われる

a を t 配下に移動 (mv a t/a)

SCMBC Git 資料

A B

/ /

ta

b c

a’

//

aa

tt

bb cc

.git

.git

git add -A; git commit

SCMBC Git 資料

//

aa

tt

bb cc

.git

.git A B C

/ //

t ta

b c

a’

新しいコミットオブジェクト

Tree は変更されたがBlob はそのまま

オブジェクトのハッシュ値

すべてのオブジェクトの SHA-1 ハッシュ 比較はすべてハッシュ値で行う

世界中で(事実上の)一意性が担保される SVN など連番リビジョン番号との違い リポジトリが分散しても安心(後述)

リモートとの通信でもハッシュ値でオブジェクトについて判断できるので高速、低負荷

SCMBC Git 資料

ブランチ

Commit オブジェクト(ハッシュ値)へのポインタ 作成、削除が高速

Commit オブジェクトの親コミットをたどることでブランチが表現できる

ブランチの切り替え 重複しているオブジェクトをハッシュ値で区別

SCMBC Git 資料

ブランチの使い方 最初は master

git branch で作成 git checkout で移動

フィーチャブランチ ( トピックブランチ ) 機能ごとにブランチをきる 短命なブランチ

さまざまなプラクティス A successful Git branching model

英語: http://nvie.com/posts/a-successful-git-branching-model/ 日本語:

http://keijinsonyaban.blogspot.com/2010/10/successful-git-branching-model.html

SCMBC Git 資料

ブランチのイメージ

ba31c 23ca1

master

HEAD

HEAD は現在のブランチを表すSCMBC Git 資料

git branch b

ba31c 23ca1

master

HEAD

b

SCMBC Git 資料

git checkout b

ba31c 23ca1

master

b

HEAD

SCMBC Git 資料

edit & git commit …

ba31c 23ca1

master

99214 111115

b

SCMBC Git 資料

HEAD

git checkout master

ba31c 23ca1

master

99214 111115

b

HEAD

SCMBC Git 資料

edit; git commit

ba31c 23ca1

master

99214 111115

b

HEAD

12bae

SCMBC Git 資料

git merge b

ba31c 23ca1

master

99214 111115

b

HEAD

12bae ccb32

両方の変更点を問題ない形で持つSCMBC Git 資料

git reset --hard 23ca1

ba31c 23ca1

master

99214 111115

b

HEAD

12bae ccb32

SCMBC Git 資料

git merge b

ba31c 23ca1

master

99214 111115

b

HEAD

12bae ccb32

SCMBC Git 資料

ブランチを移動するだけでマージ完了→fast forward merge

git reset --hard 12bae

ba31c 23ca1

master

99214 111115

b

HEAD

12bae ccb32

SCMBC Git 資料

ちょっと表記を変更

A B

master

1 2

b

HEAD

C M

SCMBC Git 資料

git checkout b

A B

master

1 2

b

C M

SCMBC Git 資料

HEAD

git rebase master

A B

master

1 2

bC M

SCMBC Git 資料

HEAD

1’ 2’

図が見にくいのでマージコミットを消す

A B

master

1 2

bC

SCMBC Git 資料

HEAD

1’ 2’

fast forward merge 可能!

実は SVN でもやってた

A B

リポジトリ

未コミット

自分

C

SCMBC Git 資料

競合が発生してコミットできない・・・

D

SVN での Update 時の競合の解決≒ rebase

A B

リポジトリ

未コミット

自分

C

SCMBC Git 資料

競合を解決・・・ここが rebase っぽい

D

SVN での Update 時の競合の解決≒ rebase

A B

リポジトリ

E

自分

C

SCMBC Git 資料

そしてコミット!ただしこの作業はやり直し不可

D

分散リポジトリの例repository A

repository B

ba31c 23ca1

ba31c 23ca1

git clone

SCMBC Git 資料

分散リポジトリの例repository A

repository B

ba31c 23ca1

ba31c 23ca1

リポジトリはバラバラに成長するが、区別できる

SCMBC Git 資料

924c3

7128d

git fetch originrepository A

repository B

ba31c 23ca1

ba31c 23ca1

変更分だけ取得

SCMBC Git 資料

924c3

7128d

924c3

origin/master

master

git merge origin/master; git pushrepository A

repository B

ba31c 23ca1

ba31c 23ca1

変更点を通知

SCMBC Git 資料

924c3

7128d

924c3 origin/master

master

23ca1

23ca1

7128d

さいごに

SCMBC Git 資料

オブジェクトを理解し、 ブランチの考え方を理解し、 コミットグラフを頭に思い浮かべることができれば勝てる

そうすれば reset とか rebase も理解しやすいよ!みんなで reset/rebase しまく

ろう!

top related