git fetch与git fetch原始主机对跟踪分支有不同的影响
这主要是出于好奇,因为我正试图熟悉Git。我已经看过了“git fetch”的文档,但没有看到下面的明显解释。提前感谢,如果这是显而易见的,请道歉 1) 我从一个中央存储库(比如GitHub)克隆了一个名为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
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
之后,在HostBmaster
和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欢迎您。当我对远程跟踪分支有疑问时,我总是回到过去。