在创建一个新的 GitHub 存储库后,由于远程存储库包含了你本地没有的工作,所以更新被拒绝了。

265
我创建了一个新的仓库,克隆了它,将文件添加到目录中,使用add -A命令将它们添加到仓库中,提交了更改,但当我尝试使用git push <repo name> master命令推送时,出现以下错误信息:

提示:更新被拒绝,因为远程仓库包含了本地没有的工作内容。这通常是由于另一个仓库向相同的引用推送了内容所致。在再次推送之前,您可能需要先合并远程的更改(例如,使用'git pull'命令)。

这似乎不合理,因为这是一个新的仓库,只包含一个自述文件。
11个回答

425
如果您使用README和/或LICENSE文件初始化了一个新的GitHub存储库,则会发生这种情况。
git remote add origin [//your github url]

//pull those changes

git pull origin master 

// or optionally, 'git pull origin master --allow-unrelated-histories' if you have initialized repo in github and also committed locally

//now, push your work to your new repo

git push origin master

现在您就可以将代码库推送到Github了。基本上,您需要将这些新初始化的文件与您的工作合并。git pull会为您获取和合并文件。如果您喜欢,也可以获取和合并文件。


16
我制作了一段YouTube视频,其中包含更详细的解释和两种避免出现此问题的建议方法。 - Kevin Markham
27
对于合并命令,我需要使用 git pull origin master --allow-unrelated-histories - Luciano Marqueto
3
我得到了 "fatal: refusing to merge unrelated histories" 的错误提示。 - Sergi
6
尝试使用以下命令进行拉取:git pull origin master --allow-unrelated-histories - palerdot
git pull origin master --allow-unrelated-histories 使我获救了。谢谢。 - Matin

162

可能出错的原因是您提交的代码结构与 GitHub 上存在的代码结构不同。这会产生冲突,可以通过以下方式解决:

git pull

解决合并冲突:

git push

如果您确认您的新代码没有问题,您可以使用:

git push -f origin master

-f 表示“强制”。


25
这条命令是"git push -f origin master",它有助于提交代码到远程仓库中的"master"分支,并强制覆盖已有的提交记录。 - Saurabh
8
使用git push -f命令会用本地的提交历史覆盖远程仓库中的提交历史,请在使用时小心。特别是在公共代码库中。 - Andre
2
如果您在远程的Github仓库中进行了更改,例如使用Github GUI更改了readme文件,然后尝试将新工作推送到Github,则会出现“更新被拒绝”的消息,因为更改已经存在于远程但本地不存在。 - Deke

19

如果这是您第一次提交代码,请修改

git push <repo name> master

把它改成这样!

git push -f <repo name> master

1
这会丢弃像最初在源中创建的文件。相反,在获取远程文件并合并您的提交之前,请先使用git pull。就像被接受的答案所述。 - Yuna
@jayjaybricksoft 谢谢您的评论。这是第一次推送,因此替换原始文件是可以的。 - Mahyar

16

4

如果你进行了浅克隆,这种情况也可能发生。在这种情况下,“远程仓库包含本地没有的工作”的说法在技术上始终是正确的,因为你只有有限的提交记录,而远程仓库很可能拥有完整的历史记录。如果本地仓库只有一个新的提交(这在 CI 系统中可能发生),这就会导致问题,因为没有共同的提交,无法使用 git 推送。

解决方案之一是执行一个更浅的克隆。

对于 Github Actions,你可以设置fetch-depth: 0以获取“所有标签和分支的完整历史记录”。对于大型仓库,你可能需要调整该参数,例如在浅克隆后运行git fetch --shallow-since=<date>,但对于小型仓库来说,这应该可以满足要求。

steps:
  - uses: actions/checkout@v3
    with:
      fetch-depth: 0

3

我在推送最后一次提交之后,直接在存储库中手动编辑了几个文件,并因此得到了相同的错误。

请使用 git push -f origin master 强制更新,而不是 git push origin master

如果你确切地知道存储库中发生了什么变化,并且你百分百确定要本地提交替换所有内容,才建议这样做。我的项目只是一个自己的兴趣项目,没有其他人在共同开发,除了手动更改之外,也没有从其他设备进行任何提交。


2

提供的答案对我没有用。

我在GitHub上有一个空的仓库,只有LICENSE文件和一个本地提交。以下方法有效:

1. git remote add origin [your repository url]

2. git push -u origin master

这将把你本地的master分支推送到远程仓库,并将其设置为默认分支。

希望对你有所帮助!

$ git fetch
$ git merge --allow-unrelated-histories
Merge made by the 'recursive' strategy.
 LICENSE | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
 create mode 100644 LICENSE

在合并之前,您可能需要做以下几点:

最初的回答

$ git branch --set-upstream-to origin/master
Branch 'master' set up to track remote branch 'master' from 'origin'.

1
我按照以下步骤进行操作:

拉取主分支:

Pull the master:

git pull origin master

这将同步您的本地代码库与Github代码库。添加您的新文件,然后:
git add .

提交更改:
git commit -m "adding new file  Xyz"

最后,推送 origin master:
git push origin master

刷新你的Github仓库,你将会看到新添加的文件。


0
如果您正在使用Visual S2019,按照以下步骤创建一个新的本地分支,然后将更改推送到存储库。

VS2019 local branch


0
问题是本地代码库与主分支不同步,所以我们在将代码推送到Git之前需要先进行拉取操作。
git add .
git commit -m 'Comments to be added'
git pull origin master
git push origin master

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