/var/log/messages

debugging with sixth sense

A Hackers Guide to Git (3)

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 以降も読んで記録を残す方向にて。

Comments