微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Git 中获取 master 分支的默认值? 回答你的问题有两个问题头部

如何解决如何在 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

解决方法

回答你的问题有两个问题

您提到了 mainmaster。现在,这里的第一个问题是目前实际上没有任何 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。如果他们的存储库是非裸的,这意味着他们运行了 developgit checkout develop

如果他们有一个 bare 存储库,他们仍然可以获得相同的效果,使用 git switch developgit --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 举报,一经查实,本站将立刻删除。