5分で分かるgitのrefspec
- 20. 指定による挙動の違い
6
git fetch origin …
無指定
普通にcloneした場合、.git/configのremote.origin.fetchに
+refs/heads/*:refs/remotes/origin/*
というデフォルト値(*はワイルドカード)が設定されており、
これを指定したことになる。
つまりリモートリポジトリの全ローカルブランチを
ローカルの同名リモート追跡ブランチにそれぞれfetchする。
<以降、このデフォルト値は弄っていない前提で記述>
<ref> <ref>: と同じ。
<src>:
remote.origin.fetchの設定で対応する<dst>が決まる。
(デフォルト値なら同名のリモート追跡ブランチが<dst>)
対応する設定がない場合でもFETCH_HEADは更新される。
<src>:<dst>
<src>を<dst>にfetchする。
<dst>をリモート追跡ブランチにしたい場合は
hoge:refs/remotes/origin/hoge のように指定する。
- 21. 7
git pull origin …
無指定
fetch :git fetchと同じデフォルト値が使われる。
merge:カレントブランチが追跡ブランチであれば
.git/configのbranch.<name>.mergeに設定があるはず。
そこからカレントブランチに対して行われる。
(普通はリモートリポジトリの同名ブランチになっている)
<ref> <ref>: と同じ。
<src>:
fetch :git fetchの場合と同じ。
merge:<src>がカレントブランチにmergeされる。
refspecを複数指定した場合、
全<src>がカレントブランチにmergeされることに注意。
<src>:<dst>
fetch :git fetchの場合と同じ。
merge:同上。複数指定時も含め<dst>の指定は無関係。
指定による挙動の違い
- 22. 8
git push origin …
無指定
remote.origin.push の設定値が使われる。無ければ
push.default の設定(≠refspec)に応じた挙動となる。
push.default が明示的に設定されていない場合、
2.0以降だと「simple」が使われる。
いくつか種類があるため要理解。(ものによっては事故る)
<ref> <ref>:<ref>と同じ
: push.default = matching を指定した場合と同じ。
:<dst>
空の<src>を<dst>にpush、つまり
リモートリポジトリの<dst>ブランチを削除する。
<dst>に対するリモート追跡ブランチも消してくれる。
試した限りremote.origin.fetchの設定を見てるっぽい。
<src>:<dst>
ローカルの<src>をリモートリポジトリの<dst>にpush。
<dst>に対するリモート追跡ブランチにも反映(作られる)。
こちらも試した限り、remote.origin.fetchの設定を見て
リモート追跡ブランチだと判定しているっぽい。
指定による挙動の違い