git fetch vs. git fetch origin master对跟踪分支有不同的影响?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (56)

这主要是好奇心的本质,因为我试图熟悉Git。我已经看过'git fetch'的文档,但是我没有看到下面的明显解释。在此先感谢,如果这显而易见。

1)从中央存储库,GitHub上说,我克隆了一个名为存储库website上的每个两台机器,HostAHostB

2)HostA,我对文件进行更改README.txt,然后提交。 在这一点上HostA,分支机构的承诺masterorigin/master预期不同,因为我还没有推出

git show master
git show origin/master

报告不同的哈希值(因为master有变化而origin/master没有)

3)一旦我推,他们在那之后也是如此。

4)现在,HostB如果我做了以下工作:

git fetch
git merge FETCH_HEAD

之后,在HostB上,masterorigin/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>参数的格式是一个可选的plus +,后面跟着source ref <src>,后跟一个冒号:,后跟目标ref <dst>。 匹配的远程参考文件<src>被提取,如果<dst>不是空字符串,与之匹配的本地参考文件将被快速转发<src>

让我重复一遍:

如果<dst>不是空字符串,则匹配它的本地引用将被快速转发<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'分支 换句话说,你没有指定你的目的地的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。

扫码关注云+社区