Github问题:Git推送到master分支,而不是main并且无法合并两者
每次我在 github 上创建存储库并推送我的文件时,它都会创建两个分支,主分支和主分支。所有更改都转到主分支,当我转到“比较和拉取请求”时,它说没有什么可比较的,因此无法推送到主分支。
这些是我采取的步骤: 转到 github,创建一个存储库。转到我的文件夹并运行git init
, git add .
, git commit -m "first commit"
, git remote add origin my@repository
,git push -u origin master
现在我知道了,我需要创建一个主分支,所以我也运行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
,但它给出了消息:Already up to date
,反之亦然,从主分支尝试合并主分支(只是为了检查)并给出相同的消息。也尝试运行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'
请注意,我也以不同的顺序尝试了所有这些命令,结果出现了相同的错误。
我能做些什么来解决这个问题?
回答
整个问题是基于一个误解,总结在你的第一句话:
每次我在 github 上创建存储库并推送我的文件时,它都会创建两个分支,主分支和主分支
不,这不是“它”所做的。那是你正在做的事情。如果你不希望这种情况发生,那就不要这样做。为了避免这样做,你需要先思考,然后再行动。你需要决定你希望事情变成什么样,然后你才采取行动让它变成这样。
让我们谈谈您需要做出的决定,以及如何使它们成真。
首先,当你在 GitHub 上创建 repo 时,你需要决定它是完全空的还是应该有任何初始元素,比如 README。
我喜欢我的 repo 是完全空的。在那种情况下,它根本没有分支。因此,在本地端,一切都取决于您。GitHub 提供了关于此时要做什么的非常清晰的说明。假设您已经创建了一个现有的本地存储库:
git init
git add .
git commit -m "first commit"
现在你的默认分支是master
. 因此,您现在必须决定是保留它还是将其更改为main
. 无论哪种方式,在您做出决定之前不要推动!
如果您决定将其保留为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 明确地告诉您这一点。但无论如何让我们继续这个替代方案。
假设您选择使用自述文件启动您的 GitHub 存储库。好的,现在GitHub 存储库确实有一个初始分支,它是 main
. 因此,现在您再次有两种选择来决定在本地机器上做什么:您必须决定是使用同一个 GitHub 存储库的空副本在本地启动,还是使用您可能已经拥有的存储库在本地启动。
如果你决定开始在当地空的,那么就不能说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
现在您已经将远程仓库和本地仓库与相同的分支和相同的内容折叠在一起。