Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

5分で分かるgitのrefspec

13,535 views

Published on

社内勉強会のLT用資料

Published in: Technology
  • Login to see the comments

5分で分かるgitのrefspec

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

×