5分で分かる(?)

gitのrefspec
HC勉強会 2015/02
1
話すこと
2
1
2
3
4 緩いまとめ
指定による挙動の違い
refspecとは何か
pushとかpullのおさらい
pushとかpullのおさらい
master
branch1
branch2
local
3
pushとかpullのおさらい
master
branch1
branch2
local
git clone
3
pushとかpullのおさらい
master
branch1
branch2
master
originlocal
3
origin/master
origin/branch1
origin/branch2
pushとかpullのおさらい
master
branch1
branch2
master
originlocal
ローカルブランチ
この場合、masterは
origin/masterを追跡する
追跡ブランチでもある
(git branch -vv で確認できる)
3
origin/master
origin/branch1
origin/branch2
名前がつく
リモート追跡ブランチ
基本的に直接弄っちゃダメ
(git branch -a で確認できる)
pushとかpullのおさらい
master
branch1
branch2
master
originlocal
git fetch
3
origin/master
origin/branch1
origin/branch2
pushとかpullのおさらい
master
branch1
branch2
master
originlocalリモートの全ローカルブランチを
リモート追跡ブランチにfetchする
(設定がデフォルトの場合)
3
origin/master
origin/branch1
origin/branch2
pushとかpullのおさらい
master
branch1
branch2
master
originlocal
3
origin/master
origin/branch1
origin/branch2
(master上で)
git merge
pushとかpullのおさらい
master
branch1
branch2
master
originlocal
追跡ブランチにいる場合、
引数を省略すると
追跡先がマージ元となる
3
origin/master
origin/branch1
origin/branch2
pushとかpullのおさらい
master
branch1
branch2
master
originlocal
3
origin/master
origin/branch1
origin/branch2
fetch + merge = pull
pushとかpullのおさらい
master
branch1
branch2
master
originlocal
git push
3
origin/master
origin/branch1
origin/branch2
pushとかpullのおさらい
master
branch1
branch2
master
originlocal
3
origin/master
origin/branch1
origin/branch2
リモートリポジトリと
リモート追跡ブランチに反映される
(対象となるブランチは設定次第。後述)
pushとかpullのおさらい
master
branch1
branch2
master
originlocal
3
origin/master
origin/branch1
origin/branch2
以上、一般的な動き。
これを踏まえて
4
refspec(参照仕様)とは何か
5
git origin [master..]
このスライド中は
origin固定で
{ }
push
pull
fetch
refspec(参照仕様)とは何か
5
git origin [master..]
ここがrefspec(複数指定可)
{ }
push
pull
fetch
refspec(参照仕様)とは何か
5
git origin [master..]
ここがrefspec(複数指定可)
+<source>:<destination>
{ }
push
pull
fetch
省略しない場合の書式
refspec(参照仕様)とは何か
5
git origin [master..]
ここがrefspec(複数指定可)
+<source>:<destination>
参照元
pushの場合ローカル側
pullの場合リモート側
参照先
pushの場合リモート側
pullの場合ローカル側
{ }
push
pull
fetch
省略しない場合の書式ffでなくても更新する
(オプション)
指定による挙動の違い
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 のように指定する。
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>の指定は無関係。
指定による挙動の違い
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の設定を見て
リモート追跡ブランチだと判定しているっぽい。
指定による挙動の違い
緩いまとめ
9
特にpullで明示的に指定する場合、
全<src>がカレントにmergeされることに注意。
その上で、良く分からないなら
refspecは無指定が無難。多分望んだ挙動になるはず。
まず自分の環境におけるpush.defaultと
その挙動を理解する。明示的に設定しておくことを推奨。
Pro Gitは一回読むべき。特に「Git Internals」の章。
無指定でエラーになる場合は
upstream周りの設定を見直した方が良い(と思う)。
参考元・使わせてもらった素材など
10
http://www.flopdesign.com/freefont/smartfont.html
cocodrips/keynote-themes
man git-push, pull, fetch, config
Pro Git Chapter 10.5
http://git-scm.com/book/en/v2/Git-Internals-The-Refspec
スマートフォントUI
ご清聴
ありがとうございました
11

5分で分かるgitのrefspec