ハンズオン
200階(カストロ、ヒソカレベル)
基本ルール
● コミットのたびにオブジェクトの図をノー
トに書く
● リポジトリの内部を見る
1. リポジトリの作成
ハンズオン用のリポジトリ、作業ディレクトリを作成
する
$ mkdir hh_git
$ cd hh_git
$ git init
1. リポジトリの作成
.git/ の中身を見る
● objects/ は info/ と pack/ だけ
● HEAD の中身が master になっている
● refs/heads/ の中身が空
● refs/tags/ の中身が空
2. READMEを作る
空のファイルをコミットしてみる
$ touch README
$ git add README
$ git commit -m "add README"
3. リポジトリの状態を見る
まずはログを見る
$ git log
ここでコミットのハッシュ値(sha-1)をメモる。
3. リポジトリの状態を見る
1. commitオブジェクトの中身を見る
$ git cat-file -p <sha-1>
2. 更にtreeオブジェクトの中身を見る
$ git cat-file -p <sha-1>
3. .git/objects/ の中身を見る
3. リポジトリの状態を見る
4. リポジトリの状態を図に書く
 (↓な感じの図をノートに書く)
commit
tree
blob5f97f 543b9 e69de
blobのsha-1はファ
イル内容で決まるた
め、同じになるはず
commit, treeのsha-1は環境
によって変わる
4. 別のファイルを作る
その前に、一作業。
masterブランチは邪魔なので、ブランチを外す。
commitのsha-1をチェックアウトする。
$ git checkout <sha-1>
※ この資料だと 5f97f になる
ブランチを外した理由は後ほど説明。
4. 別のファイルを作る
課題: 今日の勉強会の内容をメモに書く
1. ファイルを作成し、add & commit をしてみる
2. cat-file -pで先ほどと同じくノートに図を書く
3. 今作成したファイルを更に編集し、 もう1回 add
& commit をする。
4. cat-file -p で同じくノートに図を書く。
4. 別のファイルを作る
5.図がこんな感じになる
● e69de が同じオブジェクト
を参照している
66e82
5f97f 543b9 e69de
8ed4f
89c43
97671
1b92b
e69de
e69de
e3cbd
commit, treeのsha-1は環境
によって変わる
5. (無名)ブランチを作る
1. READMEを作った<sha-1>をcheckoutする
$ git checkout <sha-1>
※ この資料だと 5f97f 。先ほど作成したファイル
がディレクトリから消えればOK
2. README を編集して、commit & 図を書く
5. (無名)ブランチを作る
3.図がこんな感じになる
● gitは自然に分岐する
66e82
5f97f 543b9 e69de
8ed4f
89c43
97671
1b92b
e69de
e69de
e3cbd
commit, treeのsha-1は(ry
5226ddc1f7 06931
6. マージコミットを作る
今日の勉強会のメモを書いていたsha-1をマージ
する
$ git merge --no-ff <sha-1>
※ この資料だと 8ed4f
6. マージコミットを作る
図がこんな感じになる
● マージコミットは親が2
つある
● blobが上手くマージさ
れている
66e82
5f97f 543b9 e69de
8ed4f 89c43
97671
1b92b
e69de
e69de
e3cbd
commit, treeのsha-1は(ry
5226d
dc1f7 06931
5e5de
dc1f7
97671
bce2d
休憩: fast-forward
図で分かるgit-mergeの--ff, --no-ff, --
squashの違い
http://d.hatena.ne.
jp/sinsoku/20111025/1319497900
7. 手作りブランチ
1. 現在のブランチの状況を見てみる
$ git branch
2. .git/refs/heads/master を見てみる
$ cat .git/refs/heads/master
7. 手作りブランチ
3. 勉強会のメモからブランチを作ってみる
$ echo "<sha-1>" > .git/refs/heads/piyo
※ この資料だと 8ed4f... の40桁
4. 作成したブランチが表示される事を確認
$ git branch
5. チェックアウトしてみる
$ git checkout piyo
7. 手作りブランチ
6. .git/HEAD を見てみる
=> ブランチに変わっている
7. cherry-pickでREADMEの変更を取得してみる
$ git cherry-pick <sha-1>
※ この資料だと 5226d
8. ノートに図を書いてみる
7. 手作りブランチ
図がこんな感じになる
66e82
5f97f 543b9 e69de
8ed4f 89c43
97671
1b92b
e69de
e69de
e3cbd
commit, treeのsha-1は(ry
5226d
dc1f7 06931
5e5de
dc1f7
97671
bce2d
...
...
...
7. 手作りブランチ
9. .git/refs/heads/piyo の中身を見てみる
ブランチをcheckout した状態でコミッ
トするとsha-1が更新される
8. リモートの変更を取得する
1. リモートにあるリポジトリから変更を取得してみ
る。
$ git fetch git://github.com/sinsoku/banana
※もし自分のリポジトリを持っていれば、そちらで
試してもOK
8. リモートの変更を取得する
2. コミットオブジェクトの有無を確認する。
$ git show <sha-1>
※ この資料だと 73c99
リモートの変更が取得できている。ただ、この方法で
は<sha-1>が分からないとログを表示できない。
9. リモートに名前をつける
1. URLに名前を付けることができる
$ git remote add <name> <url>
例:
$ git remote add sinsoku 
git://github.com/sinsoku/banana
9. リモートに名前をつける
2. リモートの変更を取得する
$ git fetch sinsoku
3. .git/refs/remotes/, .git/refs/tags/ を見てみる。
4. git branch -a でブランチを表示する
リモートリポジトリのブランチがローカルに複製さ
れている事が確認できる
9. リモートに名前をつける
補足
● リモートのタグも .git/refs/tags/ に入るため、ローカルとリ
モートのタグは混ざる
● リモートのブランチの複製はfetchのタイミングで更新される
(リモートが別の人に更新されても、ローカルに複製された
ブランチは古いまま)
● git clone <url> は git init の後に、git remote add
origin <url> している事と同じ
10. ブランチの履歴
ブランチは更新履歴を持つ
$ git reflog show piyo
● rebaseやresetを使用した時に重宝する
● 基本的に git gcが走るまでオブジェクトが消え
たりしない

Git天空闘技場_ハンズオン