如何理解 .git/conf 文件中的远程 "origin" 获取设置?

how to understand remote "origin" fetch setting in .git/conf file?

我从this article学习pull & request时看到了.git/config中的命令。

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 = ... 的均值和差异设置?
为什么 [branch "1"] 会被自动追加?

谢谢

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

参考规范

fetch 设置的值就是所谓的 refspec,一种特殊的 Git 语法,用于映射 local 分支引用远程 个。

它采用以下形式:

<source>:<destination>

fetch 的情况下,<source> 是存在于 remote 存储库上的分支,而 <destination> 是它的分支应该映射到 local 存储库中。所以,例如:

fetch: +refs/heads/master:refs/remotes/origin/master

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

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

拉取请求分支

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

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

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

的分支引用
refs/pull/42

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

如果您想将 每个 存在于 GitHub 上的 remote 存储库中的拉取请求分支映射到相应的本地同名分支,你会说:

fetch = +refs/pull/*/head:refs/pull/origin/*

其中 * 是匹配任何名称的通配符。使用此设置,下次您在本地存储库中执行 git fetch 时,Git 将下载存在于 pull 目录中的 所有 分支引用 GitHub,并在pull/origin.

目录下的本地仓库中创建相应的分支

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

    GitHub        Your Repo
pull/42/head -> pull/origin/42

远程分支机构

请注意,pull/origin/* 分支(虽然它们确实存在于您的本地存储库中)并不意味着您可以提交。它们被称为 remote-tracking branches 并被 Git 用来跟踪远程存储库中存在的给定分支。

文档 says it best:

Remote-tracking branches are references to the state of remote branches.

更具体地说:

Think of them as bookmarks, to remind you where the branches in your remote repositories were the last time you connected to them.

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

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

git checkout -b 42 pull/origin/42

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

 Local      Remote        GitHub
  42 -> pull/origin/42 -> pull/42

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

[branch "42"]
remote = origin
merge = refs/pull/42/head

remote 分支和物理上位于另一台机器上的分支(即在 GitHub 上)之间的关系使用 refspec 表示 我们一开始看到的语法。