git push origin master のコマンドにてmasterブランチはローカル側のやつかリモート側のやつかどっちことだかわからなかったので調査した。
はじめに結論
git push/fetch origin masterのmasterはソース元を意味している。
なので
git push origin masterのmasterは ローカル側のmasterブランチを指していて、
git fetch origin masterのmasterは リモート側のmasterブランチを指している。
理屈
そもそも
git pushとかgit fetchのヘルプを見ると
git push/fetch [<repository> [<refspec>...]]
とある
つまりoriginが<respository>にあたり、masterが<refspec>にあたる
<refspec>ってなんですか
git pushとかgit fetchとかのヘルプで<refspec>の部分を探すと共通して書いてあるのが、
The format of a
<refspec>parameter is an optional plus +, followed by the source ref<src>, followed by a colon :, followed by the destination ref<dst>. The colon can be omitted when<dst>is empty.
<refspec>の形式は+オプション<src>``:``<dst>らしい。
これでわかるのが、<refspec>はソース元と提供先を示すためのもの(+オプションをつけることでfast-forwarded状態でなくても提供先のものを更新する)
でも普段は:を使って分けたりしないし(他の人はしてるのかな)、結局git push/fetch origin masterのmasterはソース元なのか提供先なのか。
git push、git fetchのヘルプを見てみると共通して書いてあるのが、
:<dst>part can be omitted
つまりgit push/fetch origin masterのmasterでは:<dst>の部分を省略していた!
ので、masterは<src>意味していて、冒頭の結論ということになる。
補足(使い方など)
git push
プルリクエスト送信
The
<src>is often the name of the branch you would want to push, but it can be any arbitrary
とあり、任意のブランチをリモート先にpushすることができ、リモート先のレポジトリに名前がない場合は作成される。これはGitHubではこれはコマンドライン上でプルリクエストを送ることを意味する。
リモートブランチ削除
git push origin :branch2
では<src>が空のものがリモート先の<dst>へプッシュするので、リモート先のbranch2ブランチをコマンドライン上で削除することを意味する。
git fetch
git fetchでもローカル側のリモートトラックに<src>が無い場合は、新しく作成される。
masterも省略するとき
masterも省略するとき、remote.<repository>.fetchという変数を<refspec>としてgitが参照する。
デフォルトでこの変数は以下の様になっている。(git config --listとかでも見れる)
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
git fetchのヘルプによると
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.
リモート上の全てのブランチ(refs/heads/*)分を、ローカルのリモートトラックブランチ(refs/remotes/origin/*)に対して更新するということ。
つまり
git fetch origin
とすると、ローカル上のリモートトラックブランチがすべて更新される