当我学习拉动& amp;时,我在.git/config
看到了这个命令来自this article的请求。
fetch = +refs/pull/*/head:refs/pull/origin/*
我打开与fetch = +refs/heads/*:refs/remotes/origin/*
不同的配置文件。
在我阅读文章后修改fetch
设置行并运行那些git命令:
git fetch origin
git checkout -b 1 pull/origin/1
config
文件会自动添加:
[branch "1"]
remote = origin
merge = refs/pull/1/head
有人可以解释fetch = ...
的手段和差异设置吗?
为什么{@ 1}}会自动附加?
由于
答案 0 :(得分:3)
这里有很多解包方法。让我们从头开始。
fetch
设置的值是所谓的refspec,这是一种特殊的Git语法,用于将本地分支引用与远程映射一起映射
采用以下形式:
<source>:<destination>
对于fetch
,<source>
是远程存储库中存在的分支,而<destination>
是它应映射到的分支。 本地存储库。所以,例如:
fetch: +refs/heads/master:refs/remotes/origin/master
告诉Git将远程存储库中存在的master
分支(源)映射到本地的origin/master
分支(目的地< / em>的)。
+
字符是可选的,意味着Git应该更新目标分支,即使它需要合并提交(由于您通常不直接提交,因此不应该发生)到origin/master
分支。)
现在你已经了解了refspec语法,让我们谈谈从GitHub映射 pull request branches 。
如您所知,每个拉取请求都会在给定的存储库中分配一个唯一的编号。但是,您可能不知道的是,此数字最终成为与拉取请求关联的分支的名称。
例如,编号为42
的pull请求将获得名为:
refs/pull/42
请注意如何在GitHub上托管的存储库中名为pull
的子目录中创建pull请求分支。
如果要将GitHub上远程存储库中存在的每个拉取请求分支映射到具有相同名称的相应本地分支,你会说:
fetch = +refs/pull/*/head:refs/pull/origin/*
其中*
是与任何名称匹配的通配符。使用此设置,下次在本地存储库中执行git fetch
时,Git将下载存在于GitHub上pull
目录中的所有分支引用,并在本地创建相应的分支目录pull/origin
下的存储库。
这意味着对于我们的拉取请求42
,例如,映射变为:
GitHub Your Repo
pull/42/head -> pull/origin/42
请注意,pull/origin/*
分支(虽然它们确实存在于您的本地存储库中)并不适合您提交。它们被称为remote-tracking branches,并被Git用来跟踪存在于远程存储库中的给定分支。
文档says it best:
远程跟踪分支是对远程分支状态的引用。
更具体地说:
将它们视为书签,以提醒您远程存储库中的分支是您上次连接它们的位置。
您无法直接提交远程分支。如果要将其向前移动,则必须首先创建本地分支(即在本地存储库中仅存在 的分支)并将其关联到远程分支。从那时起,每次在该本地分支上执行git pull
或git push
时,Git将更新相应的远程跟踪分支。
您可以使用一个命令执行此操作:
git checkout -b 42 pull/origin/42
这会创建一个名为42
的本地分支,并将其关联到远程跟踪分支pull/origin/42
,后者又映射到GitHub上的pull/42
分支。这是它的样子:
Local Remote GitHub
42 -> pull/origin/42 -> pull/42
local 分支与远程分支之间的关系在本地存储库的配置文件中表示为:
[branch "42"]
remote = origin
merge = refs/pull/42/head
远程分支与物理上在另一台机器上(即在GitHub上)的分支之间的关系使用我们在开头看到的 refspec 语法表示