34

当我试图熟悉 Git 时,这主要是出于好奇。我查看了“git fetch”的文档,但我没有看到下面的明显解释。在此先感谢,如果这非常明显,我们深表歉意。

1)从一个中央存储库,比如 GitHub,我克隆了一个website在两台机器上命名的存储库,HostA并且HostB.

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 上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

为什么是这样?

4

3 回答 3

34

如果您的分支有关联的远程跟踪分支,这意味着它的配置如下:

git config branch.[branch-name].remote [remote-name]
git config branch.[branch-name].merge [remote-master]

git fetch其中解释这两个命令之间区别的关键部分是:

<refspec>

参数的格式<refspec>是可选的加号+,后跟源引用<src>,后跟冒号:,然后是目标引用<dst>。获取
匹配的远程引用,如果不是空字符串,则使用 快速转发匹配它的本地引用<src><dst><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'分支中(来自Jakub Narębski 's answer
    换句话说,您没有指定您的目的地参考规范

于 2012-08-10T06:14:15.620 回答
1

答案在于您从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

请注意消息如何说 origin/master 已使用来自源的 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 时,不会更新远程跟踪分支(源/主),仅更新 FETCH_HEAD。

最终结果是,当你不是真的时,你会显得领先于原产地/主人。我无法想象为什么这种行为是可取的,但这绝对是 fetch 命令的一个有趣的小怪癖。

于 2012-08-10T00:11:55.467 回答
1

如果你想自己快进合并,或者使用 git pull。您似乎不明白 git fetch 的目的不是更新您的工作树。Fetch 旨在更新您的跟踪分支。

于 2013-06-12T20:14:32.270 回答