git fetch与git fetch原始主机对跟踪分支有不同的影响

git fetch与git fetch原始主机对跟踪分支有不同的影响,git,branch,git-fetch,Git,Branch,Git Fetch,这主要是出于好奇,因为我正试图熟悉Git。我已经看过了“git fetch”的文档,但没有看到下面的明显解释。提前感谢,如果这是显而易见的,请道歉 1) 我从一个中央存储库(比如GitHub)克隆了一个名为website的存储库,分别位于两台机器HostA和hosb上 2) 在HostA上,我更改了一个文件,比如README.txt,然后提交它。 此时,在HostA上,提交分支master和 origin/master与预期不同,因为我还没有按下按钮 git show master git sh

这主要是出于好奇,因为我正试图熟悉Git。我已经看过了“git fetch”的文档,但没有看到下面的明显解释。提前感谢,如果这是显而易见的,请道歉

1) 我从一个中央存储库(比如GitHub)克隆了一个名为
website
的存储库,分别位于两台机器
HostA
hosb

2) 在
HostA
上,我更改了一个文件,比如
README.txt
,然后提交它。
此时,在
HostA
上,提交分支
master
origin/master
与预期不同,因为我还没有按下按钮

git show master
git show origin/master
报告不同的散列(因为
master
有更改,而
origin/master
没有更改)

3) 我一推,他们也一样


4) 现在,在主机B上执行以下操作:

git fetch
git merge FETCH_HEAD
之后,在HostB
master
origin/master
上,当使用
git show

但是

如果我这样做了,在主机B上:

git fetch origin master
git merge FETCH_HEAD
在这一点上,散列仍然不同

git show origin
git show origin/master
报告不同的散列

跟踪分支
origin/master
在我执行普通
git获取之前不会更新


这是为什么?

答案在于您从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 config branch.[branch-name].remote [remote-name]
git config branch.[branch-name].merge [remote-master]
解释这两个命令之间区别的关键部分是:

<refspec>

参数的格式是可选的加号
+
,后跟源引用
,后跟冒号
,后跟目标引用

获取与
匹配的远程引用,如果
不是空字符串,则使用
快速转发与之匹配的本地引用

让我重复一遍:

如果
不是空字符串,则使用

知道:

  • git fetch
    相当于
    git fetch origin master:master
    (来自分支配置的默认值),因此它将更新远程跟踪分支:为您指定refspec的目标

  • git-fetch-origin-master
    等同于“
    git-fetch-origin-master:
    ”,而不是“
    git-fetch-origin-master:master
    ”;它将“
    master
    ”分支(远程“
    origin
    ”的分支)的提取值存储在
    FETCH\u HEAD
    中,而不是存储在“
    master
    ”分支或远程跟踪“
    远程/原点/master
    ”分支(from's)
    换句话说,您没有指定refspec的目标


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

几乎重复:(事实上它是pull,而不是Fetch,没有实质性的区别)Hi-VonC:非常感谢,这正是我需要知道的。@Xoanon93欢迎您。当我对远程跟踪分支有疑问时,我总是回到过去。