A Hacker’s Guide to Git の続き。Remotes から。
Remotes
-
collaborate するための remote repository
-
Git remote は単純に別の Git repository
-
まづ bare なソレのコンセプトを理解する必要がある
-
Git は .git directory の中に全てのリポジトリを格納
-
このディレクトリの中身は blob と tree オブジェクト
-
プロジェクト全体の snapshot を作るために横断できる blob と tree なのか
-
Git は実際には working tree は必要としていない?
-
working tree は最後の commit 以降の変更を把握するため?
-
file 削除して git checkout
してみれば分かるよね -
そうか、working tree 無しで差分の履歴だけを持てば良いのか
-
ここでは直接 git なコマンドで何もできない
-
clone と pull で変更を取得して push で変更を反映する
Cloning
git clone した時に何が起きるか、なソレが列挙されてます。
- リモートに存在する全てのブランチについてリモート追跡ブランチを作る
- リモートの HEAD を checkout する
- リモート追跡ブランチ全部について git fetch する
- カレントブランチと working tree を最新にすべく git pull する
次にローカルで bare なリポジトリから clone して中身を確認しています。.git/config の記述について確認をしている模様。
- remote なエントリ
- branch なエントリ
Pushing
master に commit を作って git push しています。
- git push のみ、だと全てのリモート追跡ブランチが push される、とあるな
- 次に remote な repository に何が起きたか、を見ています
- bare の refs/heads/master には commit の hash が格納されているのか
- そして bare で
git show <commit の hash>
とすると諸々が確認できる模様
bare でこんな操作できるなんて知らなかった。
リモート追跡ブランチ
リモート追跡ブランチというのは git branch -a
した時に remotes/ で始まる出力がそれにあたるとのことです。
- `.git/refs/remotes/
/ に参照として格納とあります
他、諸々解説ありますがリモート追跡ブランチに関する事がほとんどなのかどうか。
Fetching
- git fetch はかなりシンプル
- remote の名前渡して新しい reference とそれを見たす全ての object を取得
- .git/config の
[remote "origin"]
の設定が変わるのかな - fetch なパラメータの属性は
<remote-refs>:<local-refs>
なマップ git fetch
で remote に新たに追加された branch を取得する例- `.git/FETCH_HEAD について
- リモート追跡ブランチは
git checkout
でローカルブランチとして使えるようになる件 - checkout によって
.git/refs/
配下の状態の変化について .git/config
にも新たなエントリが追加される
Pulling
git pull
が何をするか、という事についてgit fetch <remote>
を実行- マージされるべきリモート追跡ブランチを
が持ってるかどうかを見つけるために .git/FETCH_HEAD
を読む - 必要なら
git merge
する、そうでなければ (ry - これ、わしは通常手動でやっとるな
- Git の FETCH_HEAD に関するフォロー
git fetch
したら branch の情報は `.git/FETCH_HEAD に格納される- これは git fetch する度に書き換えられる模様
- もう一つリポジトリを clone して feature branch にて README を書き換えて commit を作って push まで行なった後に
- もう片方のローカルリポジトリで git fetch しています
- その時の
.git/FETCH_HEAD
を確認 - あるいは
.git/refs/heads/feature-branch
と.git/refs/remote/origin/feature-branch
の比較 - fetch のみ、なので異なる commit オブジェクトであることを確認
- pull の場合は
git fetch
に加えてgit merge FETCH_HEAD
になるのか
Toolkit 以降も読んで記録を残す方向にて。