GitHub问题:Git推送到主分支而不是main分支,无法合并两者。

11
每次我在Github上创建一个仓库并推送我的文件时,它会创建两个分支,即主分支和主干分支。 所有更改都会进入主干分支,当我点击“比较和拉取请求”时,它会显示没有要比较的内容,所以无法将更改推送到主分支。
这是我采取的步骤: 1.进入Github,创建一个仓库。 2.进入我的文件夹并运行git initgit add . ,< code> git commit -m“first commit” ,< code> git remote add origin my@repository 和git push -u origin master 3.现在我知道我需要创建一个主分支,所以我还运行了git checkout -b main,成功运行,但是当我运行git push --set-upstream origin main时,会出现错误:
 ! [rejected]          main -> main (non-fast-forward)
error: failed to push some refs to 'git@github.com:myuser/myrepo.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

我也运行了git pull,但它说已经是最新的。 同样在主分支上运行git merge master,但是它会提示:已经是最新的,反之亦然,从主分支尝试合并主要分支(只是为了检查),结果也是相同的消息。 还尝试运行git push -u origin main,但出现错误:

error: src refspec main does not match any
error: failed to push some refs to 'git@github.com:myuser/myrepo.git'

请注意,我也尝试了这些命令的不同顺序,结果都是相同的错误。
我该怎么解决呢?

你正在使用分支功能吗? - user7396942
不清楚。您想将默认分支设置为master还是main?如果是main,为什么不遵循GitHub的说明?如果是master,为什么要创建main? - matt
@matt 在整个过程中终端里没有主分支,只有 master 被创建了,但在 Github 上只有 main 分支,所以是的。 - learn123456
@matt 在 Github 上,他们将主分支更名为 main。我想要推送到 Github 上的默认分支,也就是 main 分支。按照上述 Github 的说明进行操作,但导致了这种情况。 - learn123456
@x-rw 不,只是从本地仓库。 - learn123456
显示剩余2条评论
2个回答

27
整个问题基于一个误解,这个误解可以在你的第一句话中总结出来:
“每次我在github上创建一个仓库并上传我的文件,它都会创建两个分支,主分支和 master 分支。”
不,这不是“它”做的事情,而是你自己在做。如果你不想这样发生,那就不要这样做。为了避免这种情况发生,你需要先思考再行动,你需要决定你想要的方式,然后才采取行动使其实现。
让我们谈谈你需要做出的决策,以及如何使它们成真。
首先,在GitHub上创建仓库时,你需要决定是否完全为空,或者是否应该有任何初始元素,例如 README。
“我喜欢我的仓库完全为空”,在这种情况下它根本没有任何分支。一切都由本地端自己控制。GitHub 提供了非常清晰明了的说明,告诉你在这一点上该怎么做。假设你已经有了一个现有的本地仓库,就像你创建的那个仓库一样:
git init
git add .
git commit -m "first commit"

现在你的默认分支是master。所以你现在必须决定是保留它还是改为main。无论如何,在做出决定之前都不要push

如果你决定将其保留为master,那么就像你之前做的一样添加远程并推送即可:

git remote add origin my@repository
git push -u origin master

现在 停下来。你说:

我需要创建一个主分支

不,你不需要!你已经把master作为了你的主分支,请继续使用它作为主分支。

另一方面,如果你决定要 main作为你的主分支,那么请按照 GitHub 给出的指示操作:

git remote add origin my@repository
git branch -M main
git push -u origin main

再说一遍,停止

无论如何,你只推送了一个初始分支,要么master要么main。但是,不要像你现在这样做,先推送 master ,然后神秘地改变主意,决定它应该是 main。这就是你陷入不必要的混乱的原因。


为了完整起见,假设你最初创建GitHub仓库时,希望它具有初始内容。如果你打算从本地端开始使用 git init,那么这是个糟糕的决定,GitHub会毫不含糊地告诉你这点。但让我们继续考虑这个备选方案。

假设你选择用Readme开始你的GitHub仓库。好的,现在 GitHub 仓库 已经 有了一个初始分支,它是 main。所以现在你又有两个选择:你必须决定是在本地空白的拷贝仓库上开始工作,还是在你可能已经拥有的仓库上开始工作。

如果你决定 在本地空白的拷贝仓库上开始工作,那么不要使用 git init。使用 git clone 命令将远程GitHub仓库克隆到你的本地机器上。这是在这种情况下远远最好的选择。

但是假设你没有这样做。假设你决定 从头开始创建一个单独的本地仓库。例如,你可以这样做:

 $ git init what; cd $_
 $ echo howdy > testing.txt; git add .; git commit -minitial
 $ git remote add origin my@repository

现在你遇到了麻烦,因为:

  • 你的远程仓库和本地仓库都有另一个没有的东西。

  • 你的本地仓库有master分支,但是远程仓库有main分支。

你该如何解决?我假设你接受GitHub强制要求你使用main作为主分支的观点。那么你需要执行以下步骤:

$ git branch -M main
$ git pull origin main --allow-unrelated
$ git push -u origin main

现在您已经将远程仓库和本地仓库折叠到一起,使用相同的分支和相同的内容。


在GitLab中,即使我取消选择“创建自述文件”以打开一个空的无分支项目,分支“main”也会自动创建。有什么想法吗? - user3363813
“main”分支在理论上被创建为远程头,但是除非有提交添加到其中,否则这并不重要。没有提交,它就是一个“未出生的分支”。请参阅我的https://www.biteinteractive.com/of-git-and-github-master-and-main/ ——它是关于GitHub的,但关键点是相同的。 - matt

-1

使用以下命令:

git rebase master

git add theFiles

git commit -m "your commit"

git push -f

2
你能否添加一些关于这个程序的解释? - ti7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接