即使对于老手来说,提取输出也令人困惑。以下是我解码它们的方法:
* branch feature/8067 -> FETCH_HEAD
* [new branch] feature/8067 -> origin/feature/8067
从右到左处理每一行:
第一行以FETCH_HEAD结尾,表示引用存入FETCH_HEAD。请参阅下面关于FETCH_HEAD 的注释。箭头是硬编码的(总是出现,你可以忽略它);名称feature/8067 是遥控器上引用的名称; * branch 告诉你它实际上是遥控器上的refs/heads/feature/8067,即是一个分支。因为这是存入FETCH_HEAD,所以没有其他可用信息。
第二行以origin/feature/8067 结尾。您的远程跟踪名称1origin/feature/8067(全名refs/remotes/origin/feature/8067)已创建或更新。和以前一样,我们有箭头和相同的名称。然后我们有* [new branch]:这告诉我们origin/feature/8067 以前不存在,而feature/8067 是——我们已经知道——远程上的一个分支名称。
这是我为 Git 更新 Git 存储库的内容:
ab15ad1a3b..aa25c82427 master -> origin/master
ef7435264c..5a294203ad next -> origin/next
+ f98c0007ae...e49ac33073 pu -> origin/pu (forced update)
0f4b6a451a..ff8db353a4 todo -> origin/todo
* [new tag] v2.22.0-rc1 -> v2.22.0-rc1
我们又可以从右到左工作了:
我的 origin/master 已从他们的 master 创建或更新。我的 origin/master 的值 ab15ad1a3b 但现在是 aa25c82427。因为有一个值,所以它是更新的,而不是创建的。
我的origin/next 已创建或更新,其他一切基本与上述相同(以明显差异为模)。
我的origin/pu 已被强制更新,也就是说,这不是快进,并且一些提交已被删除。来源是他们的pu 分支,而我的origin/pu 曾经是f98c0007ae,但现在是ff8db353a4。两个哈希 ID 之间有三个点(其他行只有两个点)这一事实意味着更新是强制的,因此不是快进。最前面的加号表示强制更新。 (显然,强制更新非常重要:我有 三个 的公告!)
我的origin/todo 已创建或更新,当我们到达左侧时,它显然是一个更新。
我的v2.22.0-rc1 已从他们的v2.22.0-rc1 创建或更新;这是一个新标签。
只要您有一个新名称(分支、标签或任何其他引用),根据定义,它就是一个常规的非强制创建,并且没有可用的 old..new 哈希,因此左边缘将显示为 * [new whatever]。
FETCH_HEAD 很特别:所有更新都写入.git/FETCH_HEAD,通常会清除之前的内容(但使用-a 或--append,git fetch 将改为追加)。每个获取的引用都会在FETCH_HEAD 中出现一行,给出:
没有标记not-for-merge的那一行适合git pull脚本2捞出并将该哈希ID传递给git merge或@ 987654363@.
1remote-tracking name,大多数 Git 将其称为 remote-tracking 分支,是 reference em> 在您的存储库中,其全名以 refs/remotes/ 开头,然后包含远程的名称,在本例中为 origin,和另一个斜杠,然后通常包含 分支的其余部分 遥控器上显示的名称。
reference 只是分支、标签、远程跟踪名称、refs/stash 等事物的通用名称:字符串格式名称,通常以 refs/ 开头,它会记住一个哈希 ID。对于一个分支,名称记住的一个哈希 ID 是 Git 应该认为是该分支的 tip 的提交。对于标签,名称记住的一个哈希 ID 要么是提交的哈希 ID,要么是包含附加信息(可能包括签名密钥)的注释标签对象的哈希 ID,加上标记对象的哈希 ID(通常是提交,尽管任何标记都可以指向 Git 的任何一种内部对象类型)。
Git 通过 refspec 构建远程跟踪名称。您可以在运行git fetch 时提供参考规范。如果您不提供 refspec,但提供了一个远程 name,例如 origin,Git 会从您的配置中找到正确的 refspec:
$ git config --get-all remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
origin 的标准配置始终具有这个精确的默认 refspec,但也有一些有用的非标准配置,例如由 git clone --single-branch 创建的配置。您也可以制作自己的完全奇怪的 refspecs,但根据您的扭曲程度,某些组合会导致 git fetch 不起作用。
2好吧,当git pull 还是一个脚本的时候,无论如何。为了在 Windows 上运行速度,它已经用 C 重新编码。