GitLab 做了一个"main"分支,我不能推动它,我只能推送到"master"。如何摆脱"main"分支?



我是一个新的Git用户,我在GitLab上做了一个新项目,默认情况下它有一个README.md文件和一个名为"主要";。接下来,我想把本地存储库上传到它;主";树枝我试着把它推到";主";分支,但这是不可能的。

我在Gitlab上有两个分支,一个叫做";主";只有README.md文件和一个名为";主";文件夹包含我拥有的python文件。

为什么会发生这种事?还有,为什么我不能推动";"main";,为什么?如果只有一个远程分支,我该怎么办?

我已经试过了答案,因为我不能推到";主";默认分支,但它不起作用。我得到了一个错误,我应该使用git pull,我这样做了,但仍然无法推送到main。此外,我想知道为什么当我尝试时会发生这种情况:

git branch -a

看到所有的本地和远程分支,我看不到远程";主";树枝

解决方法:我删除了项目,创建了一个新项目,并手动上传了文件。然后在终端上,我使用将默认分支更改为main

git config --global init.defaultBranch main

推了一下,就成功了。然而,现在当我想看到所有的分支使用

git branch -r

我看到了:

remotes/origin/HEAD -> origin/main
remotes/origin/main

这个";原点/头";看起来像一个分支,但在GitLab上没有显示为分支。

我不是一个活跃的GitLab用户(而是Github),但我建议您检查存储库的设置。可能默认设置是不能推送到主分支。您应该创建一个pull请求,将主分支合并到主分支。

背景信息。所有主要的git平台都将其默认分支从";主";至";主要";。所以"主";使用的是以前的大师。

要清除origin/master,假设您不想要它,只需运行:

git fetch --prune origin

(或git remote origin prune)。也可以将fetch.prune设置为true

至于origin/HEAD:这是Git称之为符号引用的东西。你的Git软件在你从其他现有的Git存储库克隆Git的过程中设置了这一点。你可以让你的Git软件用git remote set-head --auto origin更新它,也可以用git remote set-head --delete origin删除它。然而,origin/HEAD本身基本上是一个无用的东西,所以担心它没有什么意义

更长

这里发生的事情实际上很简单:

  • Git存储库主要由几个数据库组成。一个保存提交对象和其他Git对象,另一个保存名称——分支名称、标记名称和远程跟踪名称等。

    一个有用的存储库(运行git clone时创建的那种)中有很多其他东西,而服务器端存储库除了用于存储有人用git push发送给它的提交,然后在git fetchgit clone时将这些提交传递给你(或其他人)之外,其他都是无用的。大多数托管网站都添加了一堆额外的包装软件,以使服务器端存储库更有用,例如添加Pull Request(GitHub)或Merge Request(GitLab)之类的东西;问题";数据库等等。这些都很有用,但都不是Git本身的一部分。

  • 存储库的主要用途是保存提交。您可以以通常的方式将自己的提交添加到自己的存储库中("check-out"或git switch添加到某个分支、执行工作、git addgit commit);这将在存储库的所有对象数据库中插入一个新的提交。所有提交都会得到一个唯一的(全局/通用唯一)数字,因此您进行的每一次新提交都会获得一个以前从未使用过的数字,用于宇宙中任何地方的任何提交,并且永远不会再使用。这意味着提交的数字=。Git以某种方式做到了这一点,即使它在你的存储库上独立运行,而没有咨询任何其他在任何其他存储库上运行的Git软件,这既非常神奇,也在数学上是不可能的(这意味着有一天Git会崩溃,但那一天是在遥远的未来——好吧,我们希望是这样——没有人在乎)。

    这些神奇的数字是Git的哈希ID

  • Git存储库使用分支名称查找提交,并跟踪您新提交的(大多数情况下,任何名称都可以,但分支名称是我们按照惯例使用的名称)。每个分支名称只存储一个哈希ID:不多也不少。这似乎还不够,但确实如此。我们将跳过这里的所有机制,但你确实需要了解它,才能有效地使用Git。

    Git将这些名称(在本例中为分支名称)存储在其名称数据库中。git clone不会复制此名称数据库。git clone操作只复制对象数据库,因此就在git clone之后,您有其他存储库的所有提交,但没有分支——或者更准确地说,没有分支名称。

这就是最后一点。当您克隆存储库时,您的Git软件可以查看储存库的分支名称。但他们的分支名称是他们的,而不是你的。您的分支名称供使用,以跟踪您的提交。如果他们的分支名称覆盖了你的分支名称,你将无法进行和保留任何新的提交!所以你不要按原样使用他们的分支机构名称。

相反,你的Git——与你的存储库一起工作的软件——取下他们的分支的每个名称,将这些名称更改为远程跟踪名称,将origin/放在前面(或者,将远程名称放在前面,但origin是第一个远程的标准名字,大多数人永远不会添加第二个)。因此,现在不是mainmaster或它们的任何分支名称,而是origin/mainorigin/master或其他名称。对其所有分支名称重复此操作。

稍后,您将让Git使用git fetch(或git pull,但首先运行git fetch)重新连接到它们的存储库。你的Git软件将能够再次看到他们所有的分支名称,以及他们所有的最新提交。你的Git软件可以找出他们的哪些提交对你来说是新的,从他们的Git软件中获得它们,并将这些提交添加到你的存储库中,添加到所有对象(提交和支持对象)数据库中。

然后,为了记住他们的最新提交,您的Git创建或更新与其分支名称相关的远程跟踪名称。如果他们有一个新的分支feature,你就会得到一个新origin/feature

现在,假设他们创建了一个feature并添加了一些提交,而您则创建了git fetch并获得了这些提交和origin/feature。然后,他们合并他们的新提交,并删除他们的名称feature。他们不再有一个名为feature的分支。现在运行git fetch,它们会列出所有分支名称:maindeveloptest。您的Git获得任何适当的新提交,并创建或更新您的origin/mainorigin/developorigin/test

你的origin/feature怎么了?答案是:什么都没有。它什么也没发生。它只是坐在那里不新鲜。

你可以告诉你的Git软件,每当他们的(origin的)Git软件列出所有分支名称时,你自己的软件应该删除你拥有的任何过时的远程跟踪名称。你用";修剪";选项此选项默认为关闭(false)。

相关内容

最新更新