我应该如何阅读git fetch返回的消息?

时间:2019-05-30 18:08:35

标签: git git-fetch

我刚刚做了

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下创建的 new 分支?

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

第二列是<nameOfBranchOnRemoteRepo>而第三列是<repoName/nameOfBranchOnRemoteRepo>,它说我在refs中获取的远程分支指向远程中的分支吗?

2 个答案:

答案 0 :(得分:1)

即使对于老手,获取输出也会造成混乱。这是我解码它们的方式:

 * 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结尾。您的远程跟踪名称 1 origin/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哈希,因此左边缘将显示{{1 }}。

* [new whatever]很特殊:所有更新都会写入FETCH_HEAD,通常会清除之前的内容(但使用.git/FETCH_HEAD或{{1} },-a将会附加)。每个提取的引用都会在--append中出现一行,给出:

  • 哈希ID
  • 可选的git fetch字符串
  • 引用的类型和名称及其来源:

    FETCH_HEAD

不是标记为not-for-merge的一行适合$ cat .git/FETCH_HEAD aa25c82427ae70aebf3b8f970f2afd54e9a2a8c6 branch 'master' of git://... [snipped for length] 脚本 2 进行钓鱼并将该哈希ID传递给{ {1}}或not-for-merge


1 远程跟踪名称(大多数Git称之为远程跟踪分支)是引用在您的存储库中,其全名以git pull开头,并继续包含远程名称(在这种情况下为git merge)和另一个斜杠,然后通常包含其余的分支(在该遥控器上看到的名称)。

引用只是分支,标记,远程跟踪名称,git rebase等事物的通用名称:字符串格式的名称,通常以{开头{1}},它记住一个哈希ID。对于分支,名称记住的一个哈希ID是Git应该认为是该分支的 tip 的提交。对于标签,名称记住的一个哈希ID是提交的哈希ID,或者是包含附加信息(可能包括签名密钥)的带注释的标签对象的哈希ID。标记对象的哈希ID(通常是一次提交,尽管任何标记都可以指向Git的任何内部对象类型)。

Git通过 refspec 构建远程跟踪名称。您可以在运行refs/remotes/时提供refspec。如果您没有提供refspec,但提供了origin之类的远程名称,则Git会从您的配置中获取正确的refspec:

refs/stash

refs/的标准配置始终具有完全相同的默认refspec,但是有一些有用的非标准配置,例如git fetch创建的标准配置。您也可以制作自己完全怪异的refspec,尽管根据您的扭曲程度,某些组合会导致origin无法正常工作。

2 好吧,无论如何,回到$ git config --get-all remote.origin.fetch +refs/heads/*:refs/remotes/origin/* 是脚本时。为了在Windows上提高速度,它已经用C重新编码。

答案 1 :(得分:0)

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

不一定在此处创建远程分支,但是例如可能已从其他开发人员上推了。