Help us understand the problem. What is going on with this article?

【Git基礎】git push origin masterのmasterはローカル/リモートどっちのこと?

More than 1 year has passed since last update.

git push origin master のコマンドにてmasterブランチはローカル側のやつかリモート側のやつかどっちことだかわからなかったので調査した。

はじめに結論

git push/fetch origin mastermasterソース元を意味している。
なので
git push origin mastermasterローカル側のmasterブランチを指していて、
git fetch origin mastermasterリモート側の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 mastermasterでは:<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

とすると、ローカル上のリモートトラックブランチがすべて更新される

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away