我应该如何读取消息 a git fetch returns?

How should I read the message a git fetch returns?

我刚刚做了

get fetch origin feature/8067

在它下面我有 3 列:

 * branch                feature/8067 -> FETCH_HEAD
 * [new branch]          feature/8067 -> origin/feature/8067

正在尝试处理这个...阅读 here 我刚刚了解到 FETCH_HEAD 基本上意味着我最后一次 fetch 的位置。该文件将包含一个提交。

那个[new branch]是指在我的refs/remote下创建的分支吗?

我不确定我对以下内容的理解是否正确:feature/8067 -> origin/feature/8067

第 2 列是 <nameOfBranchOnRemoteRepo> 而第 3 列是 <repoName/nameOfBranchOnRemoteRepo> 并且它说我在 refs 中获取的远程分支指向远程中的那个?

第一行告诉您,提取在您的本地存储库中产生了一个新分支,并且您有它的 HEAD。第二个说新分支被设置为跟踪远程分支。 (您可以拥有一个与远程分支同名的本地分支,但不跟踪远程分支。)

远程分支不一定是在那里创建的,但可能是从其他开发人员那里推送的,例如。

获取输出即使是老手也会感到困惑。这是我解码它们的方法:

 * 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结尾。您的remote-tracking姓名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 那里得到了 created-or-updated。我的 origin/master 的值是 ab15ad1a3b 但现在是 aa25c82427。因为有一个值,所以它是更新的,而不是创建的。

  • 我的origin/next一直是created-or-updated,其他基本和上面一样(取模明显差异)。

  • 我的 origin/pu 已被强制更新,也就是说,这不是 fast-forward 并且一些提交已被 删除 。来源是他们的 pu 分支,我的 origin/pu 曾经是 f98c0007ae 但现在是 ff8db353a4。事实上,两个哈希 ID 之间有三个点——其他行只有两个点——意味着更新是强制的,因此不是 fast-forward。最前面的加号表示强制更新。 (显然,强制更新非常重要:我有 三个 的公告!)

  • 我的origin/todo一直是created-or-updated,等到左边的时候,明显是更新了

  • 我的 v2.22.0-rc1 已经 created-or-updated,来自他们的 v2.22.0-rc1;这是一个新标签。

任何时候你有一个新名称(分支、标签或任何其他引用),根据定义,它是一个常规的 non-forced 创建并且没有可用的 old..new 哈希,因此左边缘将阅读 * [new whatever].

FETCH_HEAD 是特殊的:所有 更新被写入 .git/FETCH_HEAD,通常会清除其中之前的任何内容(但 -a--appendgit fetch 将改为追加)。每个获取的引用都会导致一行出现在 FETCH_HEAD 中,给出:

  • 散列 ID
  • 一个可选的not-for-merge字符串
  • 引用的类型和名称及其来源:

    $ cat .git/FETCH_HEAD
    aa25c82427ae70aebf3b8f970f2afd54e9a2a8c6        branch 'master' of git://...
    [snipped for length]
    

标记not-for-merge的一行适合git pull脚本2钓鱼输出并将该哈希 ID 传递给 git mergegit rebase.


1A remote-tracking name,其中大多数 Git 调用 remote-tracking branch,是你仓库中的一个 reference,它的全名以 refs/remotes/ 开头,然后包括远程名称,在此大小写 origin 和另一个斜杠,然后通常保留 分支 名称的其余部分,如在该遥控器上看到的那样。

A reference 只是分支、标签、remote-tracking 名称、refs/stash 等事物的通用名称:a string-format name,一般以refs/开头,记住一个hash ID。对于一个分支,名称记住的一个哈希 ID 是 Git 应该认为是该分支的 tip 的提交。对于标签,名称记住的一个哈希 ID 要么是提交的哈希 ID,要么是包含附加信息(可能包括签名密钥)的 带注释的标签对象 的哈希 ID ,加上标记对象的哈希 ID(通常是提交,尽管任何标记都可以指向任何一种 Git 的内部对象类型)。

Git 通过 refspec 构建 remote-tracking 名称。当您 运行 git fetch 时,您可以提供一个 refspec。如果您不提供 refspec,但提供远程 name,例如 origin,Git 从您的配置中获取正确的 refspec:

$ git config --get-all remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*

origin 的标准配置始终具有此确切的默认 refspec,但也有一些有用的非标准配置,例如 git clone --single-branch 创建的配置。你也可以制作你自己的完全奇怪的 refspecs,虽然这取决于你的扭曲程度,一些组合会导致 non-functioning git fetch.

2好吧,那时候 git pull 还是一个脚本。 re-coded 在 Windows.

上的速度