git pullに関していろいろと調べてみると、あれこれと書かれてるんですが、
正直まどろっこしいというかややこしいというか…。
git-pullは幸い(?)なことにシェルスクリプトなので、
echoを入れてコマンド見れば良いんじゃないかなと思うんです。
ということで、主によく問題とされている以下の2点について調べてみました。
(本記事はgit version 1.9.5 (Apple Git-50.3)をベースとして記述しています)
以下のようなリポジトリ構成の場合、
git pullは以下の結果となる。
ここで注目するべきは2箇所。まず1つはgit-mergeの引数。
HEADにあるリビジョンをマージするから、 カレントのブランチにマージされるんです 。
git-pullのドキュメントにも
More precisely, git pull runs git fetch with the given parameters and calls git merge to merge the retrieved branch heads into the current branch.
となっている。
このことから、リモートブランチをpullすることを期待して、"git pull origin <branch>:<branch>"すると
カレントブランチにマージされてしまいます。
また、上記の事から"git pull"だけだとカレントブランチに対しての更新は、意図通りのものとなります。
もう1つはgit fetchの挙動。
git fetchはoriginのみを指定した場合は、originの追跡ブランチをすべて更新し、さらに追跡ブランチに対応するローカルブランチを更新します。
詳細な説明は以下のとおり。
When git fetch is run without specifying what branches and/or tags to fetch on the command line,
e.g. git fetch origin or git fetch, remote.<repository>.fetch values are used as the refspecs---they specify which
refs to fetch and which local refs to update.
The example above will fetch all branches that exist in the origin (i.e. any ref that matches the left-hand side of the value,
refs/heads/) and update the corresponding remote-tracking branches in the refs/remotes/origin/ hierarchy.
git fetchだけを試しにやってみると
の通り、fetchだけでdevelは更新されます。
このことから、git pullするとカレントブランチ以外の追跡ブランチも更新されることがわかります。
以下のページが分かりやすかったです。
追跡ブランチ (tracking branch) というブランチが何なのか調べた - snowlongの日記
[git]ローカルブランチがどのリモートブランチを追跡してるのか確認する方法 - dackdive's blog
git pullしても以下のエラーで更新されない場合、追跡ブランチに登録されていないです。
1$ git pull 2There is no tracking information for the current branch. 3Please specify which branch you want to merge with. 4See git-pull(1) for details 5 6 git pull <remote> <branch> 7 8If you wish to set tracking information for this branch you can do so with: 9 10 git branch --set-upstream-to=origin/<branch> devel
もし、リモートブランチが"origin"の場合、説明の通りにすればOK。
git branch --set-upstream-to=origin/devel devel
リビジョンはgit fetchした後の、.git/FETCH_HEADから取得します。
「not-for-merge以外のもの」(=カレントブランチ)がmergeするリビジョンになります。