Git:“+ refs / heads / <branch>:refs / remotes / origin / <branch>”

时间:2017-07-04 12:17:48

标签: git

Jenkins Git插件根据我的参考规范

在控制台输出中生成了以下命令
  1. 以下2个命令有什么区别?他们的输出看起来差别不大我在下面给出了他们的输出:

    命令1:

    git fetch --no-tags --progress repo.git +refs/heads/qa:refs/remotes/origin/qa --depth=1

    输出:

    From <repo>
     * [new branch]      qa         -> origin/qa
    

    命令2:

    git fetch --no-tags --progress repo.git refs/heads/qa --depth=1

    输出:

    From <repo>
     * branch            qa         -> FETCH_HEAD
    
  2. FETCH_HEAD在这里是什么意思?

  3. 我相信refs/heads/qa是'qa'分支的本地工作副本,refs/remotes/origin/qa是远程'qa'分支。但是,这个惯例意味着什么?

    +参/头/ QA:参/遥控器/来源/ QA

1 个答案:

答案 0 :(得分:2)

带有两个以冒号分隔的引用的语法,其中整个事物可选地以加号为前缀,是 refspec 。 Refspecs也可以省略冒号并且只包含一个引用,在这种情况下,加号可能(取决于使用这个退化refspec)是无功能的。有关refspecs的更多信息,请参阅,例如What is the difference between these `git fetch` syntaxes?

以相反的顺序自己提问:

  • 第3项是完全错误的。名称refs/heads/qa 分支名称;它完全拼写出来,因为它应该在refspec中。它不是&#34;工作副本&#34;根本就是:它只是一个名称。 Git使用名称引用来从人类可读的字符串(如masterqa)映射到Git的内部哈希ID。单词 reference 是分支,标签,远程跟踪分支和其他此类名称的概括。

    同样,refs/remotes/origin/qa是完全拼写的引用, 您的远程跟踪分支通常缩写为origin/qa。就像全名为refs/heads/qa的分支一样,Git使用此名称从人类可读的字符串origin/qa映射到哈希ID。

  • 名称FETCH_HEAD指的是.git目录中的文件.git/FETCH_HEAD。当您使用非常古老的git fetch形式时,从远程跟踪分支发明之前,Git必须在某处存储所有获取的名称和ID值。那个&#34;某个地方&#34;是这个文件。然后,其他Git命令可以删除每个名称和ID对。

    回到昏暗时间,大约在2007年之前,这是你使用git fetch的唯一方法。远程跟踪分支名称的发明是因为让你自己的Git记住更长时间的这些名称是很好的 - 每个新的git fetch都会覆盖旧数据 1 ,除非你使用-a - 以及更容易使用的方式。

  • 对于第1项(区别的是什么),请参阅另一个答案。

1 如果您只从一个遥控器(例如,从origin),获取,您总是获取所有名称,这实际上是完全合理的行为:使用新的正确信息覆盖旧的陈旧信息。当您从多个遥控器获取时和/或当您逐步获取项目时,它会崩溃。远程跟踪分支机构名称,尽管它们的名称并不那么精彩,但实际上是一种很大的改进。