这是大多的好奇心,因为我试图让熟悉Git的性质。 我已经看过了“混帐取”的文件,但我没有看到一个明显的解释为以下。 在此先感谢,并道歉,如果这是嚎明显。
1)从中央存储库,GitHub上说,我克隆了一个名为库website
上每两个机, HostA
和HostB
。
2) HostA
,我进行了更改一个文件,说README.txt
,并提交。
在这一点上HostA
,对分支机构提交master
和origin/master
的,符合市场预期不同,因为我还没有推
git show master
git show origin/master
报告不同的哈希值(因为master
有变化和origin/master
没有)
3)当我推开,它们是相同的了。
4)现在,在对HostB
,如果我做到以下几点:
git fetch
git merge FETCH_HEAD
事后,主机B上master
和origin/master
报告时询问相同的哈希git show
但
相反,如果我做了,在HostB
:
git fetch origin master
git merge FETCH_HEAD
在这一点上仍然哈希不同。
git show origin
git show origin/master
报告不同的散列
跟踪分支origin/master
不更新,直到我做一个简单git fetch
为什么是这样?
如果你的分支有关联的远程跟踪分支 ,这意味着它的配置是这样的:
git config branch.[branch-name].remote [remote-name]
git config branch.[branch-name].merge [remote-master]
的关键部分git fetch
这解释了两个命令间的差别是:
<refspec>
一个的格式<refspec>
参数是可选的加+
,接着是源REF <src>
后跟一个冒号:
,接着目的地REF <dst>
相匹配的远程REF <src>
被取出,并且如果<dst>
不为空字符串,与其匹配使用快进本地REF <src>
。
让我再说一遍:
如果<dst>
不为空字符串,与其匹配使用快进本地REF <src>
。
知道:
git fetch
相当于git fetch origin master:master
(从你的分支配置的默认值),因此它将更新远程跟踪分支: 操作的Refspec的目的是为您指定 。
git fetch origin master
相当于“ git fetch origin master:
”,而不是“ git fetch origin master:master
”; 它存储“的取值master
(远程“”分支origin
在‘) FETCH_HEAD
,而不是在’ master
”分支或远程跟踪“ remotes/origin/master
”分支(来自的JakubNarębski的答案 )
换句话说, 你没有指定的Refspec的目的地
答案就在你从后面的消息git fetch
。 在第一种情况下,当你没有提供的Refspec回来,你会看到,远程跟踪分支更新:
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /depot
c67d1c8..1941673 master -> origin/master
注意消息怎么说,起源/主机与从源头上掌握更新。
现在,在第二种情况下,在指定的Refspec,你得到的东西完全不同:
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /depot
* branch master -> FETCH_HEAD
所以,当你指定的Refspec,远程跟踪分支(origin / master的)不被更新,仅FETCH_HEAD。
最终的结果是,你出现的时候你不是真的要提前起源/高手。 我无法想象,为什么这种行为是可取的,但它绝对是fetch命令的一个有趣的小怪癖。
如果你想快进合并自己,或使用git拉。 你似乎并不明白,混帐的目的是取不更新你的工作树。 取意来更新您的跟踪分支。
文章来源: git fetch vs. git fetch origin master have different effects on tracking branch