如何解决如何在 Git 中获取 master 分支的默认值? 回答你的问题有两个问题头部
简而言之,GitHub 建议使用 main
而不是 master
作为默认分支。
为了编写弹性 Git 别名,我们如何获得这个名称?如何在 Git 中获取“master”分支的默认值?
我已经搜索过 SO,但是 git - how to get default branch? 中的所有解决方案都没有对我有效...
如果我在分支 feature
中,从 develop
分叉,它将返回我 develop
而不是 master
(或 main
,其中 { {1}} 是一个叉子)...
那么如何获得“master”分支名称?
注意 -- 问题可能是:为什么 develop
没有显示我 git remote show origin
,而是显示 master
作为 develop
?
解决方法
回答你的问题有两个问题
您提到了 main
与 master
。现在,这里的第一个问题是目前实际上没有任何 default 分支。有排序,但没有保证的查询方式,因为“排序”部分是因为对此还没有达成共识:并非每个人都安装了 Git 2.28 或更高版本。 >
也就是说,运行:
git config --get init.defaultBranch
可能在你自己的 Git 存储库中生成一些东西,如果它并且如果你的 Git 是 2.28 或更高版本,你的 Git 将使用作为运行 git init
时未出生分支的默认名称。 (另见commit 8747ebb7cde9e90d20794c06e6806f75cd540142。)
注意,如果有人跑:
git init --initial-branch=xyzzy
要创建一个新的空存储库,这个新的空存储库中未出生分支的名称将是 xyzzy
,无论是否存在 init.defaultBranch
设置,也无论可能是什么在里面。 --initial-branch
选项也首次出现在 Git 2.28 中。
头部
您还询问了git - how to get default branch?的答案:
问题可能是:为什么 git remote show origin
没有显示我 master
,而是显示 develop
作为 HEAD branch
?
git remote show
命令和 git ls-remote
命令(试试看)通过调用一些其他 Git 存储库并从中获取信息来工作。在讨论此信息之前,让我们先了解一下 HEAD
在您的存储库中是如何工作的。
Git 存储库的核心是提交的集合。每个提交都用唯一的哈希 ID 编号。各地的所有 Git 系统都使用一种特定的算法——目前是 SHA-1,但有计划改用 SHA-256——根据提交的内容计算提交的哈希 ID,这样所有的 Git 系统都会想出 相同提交的 em>same 哈希 ID。
这就是 Git 在分发提交方面的工作方式。每个存储库都有自己提交的完整集合。当您交叉连接一对对 Git 存储库(例如您自己的存储库和您的 Git 调用的系统上的一个存储库 origin
)时,它们交换哈希 ID。由于散列 ID 唯一标识提交,因此发送方可以列出散列 ID,接收方可以立即判断他是否已提交或需要提交。添加一些基于提交图结构的优化,我们就拥有了拥有/想要协议交换所需的大部分内容。
不过,每个 Git 都会找到使用名称在自己的存储库中提交的内容:分支名称、标签名称和其他类似名称。这些带有哈希 ID,可以找到一些特定的提交。然后这些提交也会找到任何更早的提交。
出于发送提交的目的,git fetch
配对中的发送 Git 列出了他的分支和标签以及其他类似名称,以便接收 Git 可以确定要请求哪些提交(如果有) .您可以使用 git for-each-ref
列出您自己的名称——所有名称或某些选定的子集。默认是列出所有以 refs/
开头的名称。
上图中少了一块,那就是特殊名称 HEAD
。这个特殊的名称——它不以 refs/
开头,并且 Git 在内部以各种特殊的方式使用它——通常是 Git 所说的符号引用,我们可以阅读它git symbolic-ref
:
$ git symbolic-ref HEAD
refs/heads/master
这告诉我们在这个特定的 Git 存储库中,当前分支是名为 master
的分支。 (分支名称都以 refs/heads/
开头;其他名称以其他基于 refs/
的前缀开头。)在非裸 Git 存储库中——我们通常使用的那种——这意味着有人运行了 {{ 1}} 或 git checkout master
。
当我们使用 git switch master
连接到其他一些 Git 时,他们的 Git 会为我们运行 git ls-remote
,列出他们的名字。但是它们以 git for-each-ref
中的值作为列表的前缀,如果我们添加 HEAD
选项,1 我们可以通过两种方式获得它们的 --symref
:
HEAD
所以这告诉我 他们的 Git 存储库将 ref: refs/heads/master HEAD
72c4083ddf91b489b7b7b812df67ee8842177d98 HEAD
71ca53e8125e36efbda17293c50027d31681a41f refs/heads/maint
72c4083ddf91b489b7b7b812df67ee8842177d98 refs/heads/master
a3ce27912f980d787926b113d17f1f532e50162a refs/heads/next
[snip]
作为他们的 master
。第一个输出行直接说明了这一点;接下来的几行向我展示了它们的 HEAD
和它们的 HEAD
都引用了提交 refs/heads/master
,这不太直接。2
72c4083ddf91b489b7b7b812df67ee8842177d98
命令能够调用另一个 Git。3这意味着他们可以让他们列出他们拥有的分支作为他们的 git remote show
。当你看到:
HEAD
这仅仅意味着他们的 Git 将他们的 HEAD branch: develop
附加到他们的分支名称 HEAD
。如果他们的存储库是非裸的,这意味着他们运行了 develop
或 git checkout develop
。
如果他们有一个 bare 存储库,他们仍然可以获得相同的效果,使用 git switch develop
或 git --work-tree=... checkout
,或者直接运行 GIT_WORK_TREE=... git checkout
。 他们 git symbolic-ref
所附加的分支名称不一定是他们的 HEAD
或他们的 master
,如果他们有的话:他们控制哪个分支名称(如果有)存储在它们的 main
中。
这没有什么意义。如果他们的 HEAD
将他们的 HEAD
命名为他们的 develop
,那只是意味着他们的 HEAD
附加到他们的 develop
。由于他们的分支名称是他们的——而不是你的——这对你来说无关紧要。
不过,有一个地方确实很重要。如果你运行:
git clone <url>
而不是说:
git clone -b somebranch <url>
然后你要求你的 Git 调用他们的 Git 并询问他们推荐的分支名称。当您提供 -b branch
时,您选择的是分支;如果你不这样做,你就是在告诉你的 Git 遵循他们的建议。推荐的分支名称是其 HEAD
附加到的分支名称。因此,他们——无论他们是谁,控制着这个其他 Git 存储库——应该使用他们可以使用的任何方式将他们的 HEAD
连接到分支名称他们个人推荐。
您无需遵循他们的建议。您的克隆中包含您的 分支名称。您不需要使用他们正在使用的相同名称。这取决于你。大多数人确实大多使用相同的名字,以使事情更容易思考。
1旧版本的 Git 不支持此 --symref
选项。当新 Git 与不能进行符号引用传输的旧 Git 交谈时,新 Git 必须猜测旧 Git 的 HEAD
。这是一个有点难看的情况,我们将假设您在这里使用的是全新的 Git 版本。
2这向您展示了年龄较大的 Git 可以猜测:如果来自 HEAD
的哈希 ID 正好匹配一个分支名称,这告诉我们这是分店名称。但是如果来自 HEAD
的哈希 ID 与两个、三个或更多分支名称哈希 ID 匹配呢?这就是情况变得丑陋的地方。
3在现代 Git 中,这是您使用 git remote show
的默认方式。我不确定这是否曾经不是默认。不过,git remote
命令有很多子命令,其中很多都不会调用其他 Git。
这本身并不能回答问题,但实际上核心问题是确定存储库是使用 main
还是 master
命名标准。因此,在大多数情况下,我们可以这样做:
git branch | grep -o -m1 "\b\(master\|main\)\b"
-
-o
— 只打印匹配 -
-m1
— 只打印第一个匹配
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。