Upload
bleis-tift
View
9.846
Download
5
Embed Size (px)
Citation preview
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 しまく
ろう!