【罪と罰 その1】 追いかけても実態を掴ませないfetch。

ストクロをやりすぎてしまったKameです。
短期集中単発集やっていきます。

まずはgit fetchをちゃんと調べなくてはと思い、色々やってみました。

fetchしても外部のリモートブランチが更新されるわけではない

自分のすごく曖昧な認識では、ローカルの変更を外部のリモートブランチにpushしているくらいのイメージをしていました。
しかしこれがまず大きな間違いで、fetchはリモートブランチの変更点だけを取得してくるだけで、ローカルの更新とどうのこうのするわけではない、みたいです。

では取得してきた変更点は何処へ?

少し調べてみますと、そもそも自分の思っていたローカルブランチっていうのが全然全くさっぱり的を外していたようです。

まずリモートリポジトリをcloneするとその際に指定したリモートリポジトリのブランチのコピーが手元にやってくるようです。
さらにその際にローカルブランチはリモート(複製元)ブランチを追跡するためのブランチを持つそうです。

この追跡用ブランチっていうのは直接checkoutすることはできないようなんですが、また自分でブランチを作成してそこでまたコピーを作成すれば確認できるようです。

どんな追跡用ブランチがあるかは

$ git branche -r

で確認できるみたいです。

つまりこの追跡用ブランチを複製元リポジトリのブランチから取得してきた変更点で更新するようです。

fetchした情報を扱う

fetchした情報を扱うには「FETCH_HEAD」という、「最後にfetchされたブランチの先頭を表す簡易記法」が使えるそうです。

具体的な使用例で言えば、

$ git log  ←ログを見る
$ git diff FETCH_HEAD ←FETCH_HEADとの差分を見る
$ git merge FETCH_HEAD ←FETCH_HEADとマージ

こんな具合に扱えます。

最後に

疑問だったfetch & rebaseですが、tortoiseGitの処理なので確実なことは言えないのですが、

  1. git fetchして追跡用のブランチを更新。
  2. 更新した追跡用ブランチで自分のローカルブランチを更新。

こんな感じだと思います。

Gitはもっと理解する必要がありますね・・・。