如何理解 .git/conf 文件中的远程“原点”获取设置?

Lor*_*hen 2 git github git-config

.git/config当我从这篇文章中学习 pull & request 时,我看到了命令。

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
Run Code Online (Sandbox Code Playgroud)

config文件自动附加:

[branch "1"]
        remote = origin
        merge = refs/pull/1/head
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下的手段和差异设置fetch = ...吗?
为什么[branch "1"]会自动附加?

谢谢

Enr*_*lio 6

这里有很多东西要解压。让我们从头开始。

参考规范

fetch设置的值称为refspec,这是一种特殊的 Git 语法,用于将本地分支引用与远程引用映射。

它采用以下形式:

<source>:<destination>
Run Code Online (Sandbox Code Playgroud)

对于fetch,<source>远程存储库中存在<destination>的分支,而是它应该映射到本地存储库中的分支。因此,例如:

fetch: +refs/heads/master:refs/remotes/origin/master
Run Code Online (Sandbox Code Playgroud)

告诉GIT中的映射master存在于远程存储库(分支)到origin/master分支在本地之一(目的地)。

+字符是可选的,意味着 Git 应该更新目标分支,即使它需要合并提交(这不应该发生,因为您通常不直接提交到origin/master分支)。

拉取请求分支

现在您了解了 refspec 语法,让我们谈谈从 GitHub映射拉取请求分支

如您所知,每个拉取请求都会在给定存储库中分配一个唯一编号。然而,您可能不知道的是,这个数字最终成为与拉取请求关联的分支名称

例如,带有编号的拉取请求42将获得一个名为:

refs/pull/42
Run Code Online (Sandbox Code Playgroud)

请注意拉取请求分支是如何pull在托管在 GitHub 上的存储库中调用的子目录中创建的。

如果您想将GitHub 上远程存储库中存在的每个拉取请求分支映射到具有相同名称的相应本地分支,您可以说:

fetch = +refs/pull/*/head:refs/pull/origin/*
Run Code Online (Sandbox Code Playgroud)

where*是匹配任何名称的通配符。有了这个设置,下次你git fetch在本地仓库做的时候,Git 会下载GitHub 上目录中存在的所有分支引用,pull并在本地仓库目录下创建对应的分支pull/origin

这意味着对于我们的拉取请求42,例如,映射变为:

    GitHub        Your Repo
pull/42/head -> pull/origin/42
Run Code Online (Sandbox Code Playgroud)

远程分支

请注意,pull/origin/*分支(尽管它们确实存在于您的本地存储库中)并不适合您提交。它们被称为远程跟踪分支,Git 使用它们来跟踪远程存储库中存在的给定分支。

文档说得最好

远程跟踪分支是对远程分支状态的引用。

进一步来说:

将它们视为书签,以提醒您远程存储库中的分支上次连接到它们的位置。

您不能直接提交到远程分支。如果要向前移动,必须先创建一个本地分支(即存在于本地存储库中的分支)并将其关联到远程分支。从那时起,每次你这样做git pullgit push在那个本地分支上,Git 都会更新相应的远程跟踪分支。

你可以用一个命令来做到这一点:

git checkout -b 42 pull/origin/42
Run Code Online (Sandbox Code Playgroud)

这将创建一个名为的本地分支42并将其关联到远程跟踪分支pull/origin/42,而远程跟踪分支又映射到pull/42GitHub 上的分支。这是它的样子:

 Local      Remote        GitHub
  42 -> pull/origin/42 -> pull/42
Run Code Online (Sandbox Code Playgroud)

本地分支和远程分支的关系在本地仓库的配置文件中表示为:

[branch "42"]
remote = origin
merge = refs/pull/42/head
Run Code Online (Sandbox Code Playgroud)

远程分支和物理上位于另一台机器上(即在 GitHub 上)的分支之间的关系是通过使用我们在开始时看到的refspec语法来表达的。