【问题标题】:How should I read the message a git fetch returns?我应该如何阅读 git fetch 返回的消息?
【发布时间】:2019-10-16 10:02:05
【问题描述】:

我刚刚做了

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

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

【问题讨论】:

    标签: git git-fetch


    【解决方案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 结尾。您的远程跟踪名称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--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 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 重新编码。

    【讨论】:

    • 哇。超级感谢。这太多了,无法在工作时一次消化。要完全处理您的答案,我需要研究很多内容。我会尽快回复你
    • * branch告诉你遥控器上真的是refs/heads/feature/8067,即是一个分支,而不是* branch&* [new branch]存在什么样的指标?
    • 这是我为 Git 更新 Git 存储库的内容:你必须在任何分支上执行 git fetch origin 之后什么都没有?
    • 除了* branch* [new branch] 你还可以看到* tag* [new tag]。我的git fetch 输出显示了其中的最后一个——是的,我运行了git fetch(翻译成与git fetch origin 相同)。
    • 另一个 Git 为您的 Git 列出了它的分支和标签以及其他参考名称(以及它们的哈希 ID)。您的 Git 已选择部分或全部这些引用,复制到您自己的 Git 某处(以及 FETCH_HEAD)。所以git fetch 会显示它在other Git 中看到的名称,例如feature/8067。它是它们的缩写,但使用左侧的信息,例如* branch,我们可以找出它们的缩写。
    【解决方案2】:

    第一行告诉你 fetch 在你的本地 repo 上产生了一个新的分支,并且你有它的 HEAD。第二个表示新分支已设置为跟踪远程分支。 (您可以拥有与远程分支同名的本地分支,但不跟踪远程。)

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

    【讨论】:

    • 谢谢。 1) 第一行告诉你,fetch 在你的本地 repo 上产生了一个新的分支在我这样做之后,我做了git branch。它不在我当地的分支机构中。 2) 跟踪遥控器是什么意思?我想这意味着如果我只做git fetch 而不提及要从哪个分支获取,那么它将从分支中获取其要跟踪的集合
    猜你喜欢
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多