質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

Q&A

解決済

1回答

4278閲覧

master vs origin/master vs remotes/origin/master

yamato_user

総合スコア2321

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

0グッド

0クリップ

投稿2018/10/27 06:57

知識が希薄なため、見当違いな質問があるかと思いますが、その場合は、その質問は無視していただいて、私のGITに対する認識の修正になるような回答をいただければと思います

質問1(まずは以下をご覧ください)

GIT

1$ git branch -a 2* master 3 remotes/origin/HEAD -> origin/master 4 remotes/origin/master 5 remotes/origin/test_branch

master と origin/master と remotes/origin/masterの違いと関係性を教えてください。

質問2
git fetchするとローカルのorigin(HEAD?)がリモートの最新COMMITになるとの記述を目にしましたが、上記の出力を見るにorigin/masterとremotes/origin/masterがあることから、origin(という領域?)はローカルにもリモートにもあるということでしょうか?

質問3
「git pull」はgit fetchでローカルのoriginをリモートの最新COMMITに合わせてからgit merge origin/masterでマージしているという記述を目にしましたが、もし上記の質問2でリモートにもorigin(という領域?)があるのならば、「git push」はリモートのoriginをローカルの最新COMMITにしてから、mergeしているということでしょうか?

質問4(まずは以下をご覧ください)

GIT

1$ git branch -a 2* master 3 remotes/origin/HEAD -> origin/master 4 remotes/origin/master 5 remotes/origin/test_branch 6 7$ git checkout test_branch 8Switched to a new branch 'test_branch' 9Branch 'test_branch' set up to track remote branch 'test_branch' from 'origin'. 10 11$ git branch -a 12 master 13* test_branch 14 remotes/origin/HEAD -> origin/master 15 remotes/origin/master 16 remotes/origin/test_branch

上記でcheckoutしていますが、test_branchとremotes/origin/test_branchの違いがわかりません。remotes/origin/test_branchは参照だけできて、checkoutすることで変更可能なtest_branchが新たに生成されるという認識でしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問1

master, origin/masterremotes/origin/masterは、すべて省略された参照名(abbrev-ref)です。

ご提示の例であれば、上記3点の(完全な)参照名はそれぞれ

  • refs/heads/master
  • refs/remotes/origin/master
  • refs/remotes/origin/master

であり、後者二つは同一のものです。

質問2

いいえ。

"origin"は、複数設定できるremoteの一種で、git-cloneしたときに設定されるデフォルト名なので、一番見かけると思いますが、
gitレポジトリには複数のremoteを設定することができます。(git remoteコマンドで操作できます)

手元の操作で見えるときの"origin"はローカルに紐づく概念で、リモートレポジトリ(サーバーとか)を指示しているだけで、これ自体が同期されているわけではないです。

質問3

質問2がいいえなので、いいえ。

git-pullしたときは、今チェックアウトされているローカルブランチの、"リモート追跡ブランチ"を更新してマージします。

(先にgit fetchを行って、refs/remotes/origin/* をすべて取り込んでから)
refs/heads/master のリモート追跡ブランチが refs/remotes/origin/master であれば、これをマージします。

質問4

その通りです。
git checkout yyyyyの時に、refs/remotes/xxxx/yyyyyがあり、refs/heads/yyyyyが存在しなければ作成されます。

上記説明に沿ってしっかり言い換えると、
git checktout test_branchにより、
refs/remotes/origin/test_branch を元に 同じSHA1ハッシュ値を指す、refs/heads/test_branch という参照が作成されたということです。

余談

ちなみに、gitでは "origin/master"というローカルブランチを作成することができます。
これと"origin"における"master"リモートブランチは以下の通りに異なるrefnameになります。

  • refs/heads/origin/master
  • refs/remotes/origin/master

この辺の解釈を担っているのは"git rev-parse"というコマンドですが、上記の特殊な状態で"origin/master"を渡すとこの様になります。

$ git rev-parse origin/master warning: refname 'origin/master' is ambiguous. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

私の環境では、この時返ってきたのはローカルブランチのSHA1ハッシュでした。
ローカルが優先されるようですね。

このあたりの記事が参考になると思います。

https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81
https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-Git%E3%81%AE%E5%8F%82%E7%85%A7

投稿2018/10/27 08:48

takumiabe

総合スコア661

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問