如何从存储库中的当前git分支中查找原始复制的git分支名称?

时间:2018-07-19 21:06:02

标签: git

您将如何读取被复制以创建当前签出的分支的分支的名称?

当前分支名称为:

git symbolic-ref HEAD

假设当前分支是从另一个分支(有时称为另一个分支的克隆)的副本开始的,那么如何找到该分支的名称?

1 个答案:

答案 0 :(得分:0)

假设您没有更改任何默认设置,并且没有做任何奇怪的事情, other Git中的分支名称通常与相同您自己的Git中分支的名称。也就是说,您的 master master(您称为origin/master)相关。

但是,不能保证:如果创建一个名为xyzzy的新分支而不检查它们是否也有一个名为xyzzy的分支,则您的xyzzy可能与其{ {1}},如果您有xyzzy也没有。

背景

您不完全克隆分支; 您克隆整个存储库

您刚刚克隆的存储库传递给origin/xyzzy的URL存储在您选择的 remote 名称下。如果您没有选择,Git将使用其内置的默认值git clone,因此,您从其克隆的URL将存储在origin下:

remote.origin.url

可以限制克隆过程检查的分支名称。但是请注意,这些分支名称是在某些 other Git(在您指定的URL)上找到的:它们不是您自己的分支名称。默认是使用 all 其他Git列出的分支名称。也就是说,您的Git通过URL连接到其他Git,并让另一个Git列出了它的所有分支,所有标签以及它可以列出的所有其他名称:

$ git config --get remote.origin.url
<url>

如果将此方法应用于$ git ls-remote <url> ,则输出会很长:

git://github.com/git/git

这些都是Git愿意导出的所有名称。您的Git会使用这些名称,并修改以$ git ls-remote git://github.com/git/git b7bd9486b055c3f967a870311e704e3bb0654e4f HEAD 53f9a3e157dbbc901a02ac2c73346d375e24978c refs/heads/maint b7bd9486b055c3f967a870311e704e3bb0654e4f refs/heads/master 5c9ce644c390ec4ef3ba4adc94e7f4af17ade36b refs/heads/next 1aaaa8cf15ba4eb62d485c5c8b64d6a75b9e7c3f refs/heads/pu f59de5ad04b18866024fb298ddb276cb51d91673 refs/heads/todo [lots of text snipped] 8d091e9ed473c372a5b89d1258d1c3ad01daa04c refs/tags/v2.9.4 d61226c1118f749280c050555d83560ca0f3bf71 refs/tags/v2.9.4^{} dcba104ffdcf2f27bc5058d8321e7a6c2fe8f27e refs/tags/v2.9.5 4d4165b80d6b91a255e2847583bd4df98b5d54e1 refs/tags/v2.9.5^{} 开头的分支名称,以创建您的远程跟踪名称,将refs/heads/替换为refs/heads/ (假设您使用的是默认的远程名称refs/remotes/origin/)。

此时,您的克隆具有:

origin

依此类推,并根据您要求Git从其Git中保留的内容,加上所有标签(直接复制为refs/remotes/origin/maint refs/remotes/origin/master 仍为refs/tags/v2.12.0)。

您的Git如何创建新分支

所有下载完成后,refs/tags/v2.12.0所做的最后一件事是指示您自己的Git签出某些特定的提交(通常通过分支名称)。您可以选择您的Git应该使用的名称,但如果不使用,则Git会使用其Git的指示来选择一个名称,通常为git clone。您的Git尚未拥有这样的分支,但是您的Git 拥有具有远程跟踪名称 master({ {1}})。因此,您的Git现在使用您Git刚保存的origin/master的相同提交哈希ID,创建自己的分支refs/remotes/origin/master-master作为其全名。在上面的示例中,为refs/heads/master

Git将此称为“ DWIM”或“我的意思”:您要求Git签出一些现有的分支名称,但还没有该分支名称。因此,您的Git会探查您的远程跟踪名称,以查看是否存在匹配的名称。这种匹配必须完全匹配:如果是这样,则Git会创建您的名称,并指向与您的远程跟踪名称相同的提交。

但是,如果您使用origin/masterb7bd9486b055c3f967a870311e704e3bb0654e4f创建一个名为 git checkout -b name 的新分支,则您的Git不必查找远程跟踪名称。无论是否存在类似的远程跟踪名称,您的Git都立即创建该名称,指向当前提交。

所有这些都是可控的

所有这些精美的重命名都可以通过 fetch refspecs 由您自己控制。如果您使用标准远程名称git branch name进行了标准克隆,然后运行:

name

您将获得一行输出读数:

origin

这是一个 refspec ,它控制$ git config --get remote.origin.fetch 的默认行为:您的Git会在+refs/heads/*:refs/remotes/origin/* 处调用另一个Git,并获得与我们看到的名称相同的列表与上面的git fetch origin匹配,并将分支名称匹配到这对的remote.origin.url部分。然后它将把这些名称中的每一个重写到右侧的git ls-remote中,refs/heads/*部分将替换为之前匹配的内容。这就是他们的refs/remotes/origin/*成为您的*的机制,依此类推。

某些克隆选项(尤其是master)会更改此默认refspec。您也可以手动更换它。这样做几乎没有充分的理由-默认值通常是正确的。如果要这样做,请阅读refspec。