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

42
SCMBC Git 資資 資資資 SCMBC Git 資

Upload: bleis-tift

Post on 30-Jun-2015

9.849 views

Category:

Technology


5 download

TRANSCRIPT

Page 1: SCMBC Git入門セッション発表資料

SCMBC Git 資料

第二回 SCMBC Git 班

Page 2: SCMBC Git入門セッション発表資料

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

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

生 )

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

SCMBC Git 資料

Page 3: SCMBC Git入門セッション発表資料

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

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

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

Page 4: SCMBC Git入門セッション発表資料

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

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

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

Page 5: SCMBC Git入門セッション発表資料

Git のオブジェクト

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

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

SCMBC Git 資料

Page 6: SCMBC Git入門セッション発表資料

Blob オブジェクト

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

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

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

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

SCMBC Git 資料

Page 7: SCMBC Git入門セッション発表資料

Tree オブジェクト

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

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

SCMBC Git 資料

Page 8: 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..

Page 9: SCMBC Git入門セッション発表資料

Commit オブジェクト

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

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

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

SCMBC Git 資料

Page 10: SCMBC Git入門セッション発表資料

コミットメッセージ

SCMBC Git 資料

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

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

Page 11: SCMBC Git入門セッション発表資料

コミットの様子

SCMBC Git 資料

//

aa tt

bb cc

Page 12: SCMBC Git入門セッション発表資料

git init

SCMBC Git 資料

//

aa tt

bb cc

.git

.git

Page 13: SCMBC Git入門セッション発表資料

git add .

SCMBC Git 資料

/

ta

b c

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

//

aa tt

bb cc

.git

.git

Page 14: SCMBC Git入門セッション発表資料

git commit

SCMBC Git 資料

/

ta

b c

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

//

aa tt

bb cc

.git

.git

Page 15: SCMBC 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 以下はいじってないのでそのままのものが使われる

Page 16: SCMBC Git入門セッション発表資料

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

SCMBC Git 資料

A B

/ /

ta

b c

a’

//

aa

tt

bb cc

.git

.git

Page 17: SCMBC Git入門セッション発表資料

git add -A; git commit

SCMBC Git 資料

//

aa

tt

bb cc

.git

.git A B C

/ //

t ta

b c

a’

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

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

Page 18: SCMBC Git入門セッション発表資料

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

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

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

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

SCMBC Git 資料

Page 19: SCMBC Git入門セッション発表資料

ブランチ

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

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

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

SCMBC Git 資料

Page 20: 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 資料

Page 21: SCMBC Git入門セッション発表資料

ブランチのイメージ

ba31c 23ca1

master

HEAD

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

Page 22: SCMBC Git入門セッション発表資料

git branch b

ba31c 23ca1

master

HEAD

b

SCMBC Git 資料

Page 23: SCMBC Git入門セッション発表資料

git checkout b

ba31c 23ca1

master

b

HEAD

SCMBC Git 資料

Page 24: SCMBC Git入門セッション発表資料

edit & git commit …

ba31c 23ca1

master

99214 111115

b

SCMBC Git 資料

HEAD

Page 25: SCMBC Git入門セッション発表資料

git checkout master

ba31c 23ca1

master

99214 111115

b

HEAD

SCMBC Git 資料

Page 26: SCMBC Git入門セッション発表資料

edit; git commit

ba31c 23ca1

master

99214 111115

b

HEAD

12bae

SCMBC Git 資料

Page 27: SCMBC Git入門セッション発表資料

git merge b

ba31c 23ca1

master

99214 111115

b

HEAD

12bae ccb32

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

Page 28: SCMBC Git入門セッション発表資料

git reset --hard 23ca1

ba31c 23ca1

master

99214 111115

b

HEAD

12bae ccb32

SCMBC Git 資料

Page 29: SCMBC Git入門セッション発表資料

git merge b

ba31c 23ca1

master

99214 111115

b

HEAD

12bae ccb32

SCMBC Git 資料

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

Page 30: SCMBC Git入門セッション発表資料

git reset --hard 12bae

ba31c 23ca1

master

99214 111115

b

HEAD

12bae ccb32

SCMBC Git 資料

Page 31: SCMBC Git入門セッション発表資料

ちょっと表記を変更

A B

master

1 2

b

HEAD

C M

SCMBC Git 資料

Page 32: SCMBC Git入門セッション発表資料

git checkout b

A B

master

1 2

b

C M

SCMBC Git 資料

HEAD

Page 33: SCMBC Git入門セッション発表資料

git rebase master

A B

master

1 2

bC M

SCMBC Git 資料

HEAD

1’ 2’

Page 34: SCMBC Git入門セッション発表資料

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

A B

master

1 2

bC

SCMBC Git 資料

HEAD

1’ 2’

fast forward merge 可能!

Page 35: SCMBC Git入門セッション発表資料

実は SVN でもやってた

A B

リポジトリ

未コミット

自分

C

SCMBC Git 資料

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

D

Page 36: SCMBC Git入門セッション発表資料

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

A B

リポジトリ

未コミット

自分

C

SCMBC Git 資料

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

D

Page 37: SCMBC Git入門セッション発表資料

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

A B

リポジトリ

E

自分

C

SCMBC Git 資料

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

D

Page 38: SCMBC Git入門セッション発表資料

分散リポジトリの例repository A

repository B

ba31c 23ca1

ba31c 23ca1

git clone

SCMBC Git 資料

Page 39: SCMBC Git入門セッション発表資料

分散リポジトリの例repository A

repository B

ba31c 23ca1

ba31c 23ca1

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

SCMBC Git 資料

924c3

7128d

Page 40: SCMBC Git入門セッション発表資料

git fetch originrepository A

repository B

ba31c 23ca1

ba31c 23ca1

変更分だけ取得

SCMBC Git 資料

924c3

7128d

924c3

origin/master

master

Page 41: SCMBC Git入門セッション発表資料

git merge origin/master; git pushrepository A

repository B

ba31c 23ca1

ba31c 23ca1

変更点を通知

SCMBC Git 資料

924c3

7128d

924c3 origin/master

master

23ca1

23ca1

7128d

Page 42: SCMBC Git入門セッション発表資料

さいごに

SCMBC Git 資料

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

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

ろう!