被拒绝的主分支 -> 主分支(非快进式合并)

317

我试图将我的项目(所有文件)推送到一个新的代码库。我按照步骤进行,但是当我使用git push -u origin master进行推送时,出现以下错误:

! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:asantoya/projectnewbies.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

我遇到过很多次这个错误,但无法弄清楚该怎么做。


10
如果你确定本地代码库已经包含了你想要推送到远程仓库的最新更改,那么可以使用git push --force命令进行强制推送。请注意,该操作会覆盖远程仓库上原有的提交记录,建议谨慎使用。 - IgorGanapolsky
72
git push --force <remote_repository> 对我有用。 - Sorter
1
@Sorter - 我整天都遇到了同样的问题,这个帮了我很多!谢谢。但它没有解释为什么问题首先发生以及修复方法为什么有效。 - Padawan
2
@pmr,轻率地问OP是否“读取错误消息”根本没有帮助。显然,这个错误消息对OP来说毫无意义,就像对我和其他66个点赞他的人一样。刻薄、自以为是的言辞根本不能帮助人们。 - Padawan
3
@Padawan,你也会注意到这个“嘲讽、自认为聪明的人”提供了这个问题的被接受答案,而且有72人(可能包括你)发现它很有帮助。如果你在专业环境中问我那个问题,这将是我的第一个问题,抱歉我的评论听起来有点傲慢。有时候停下来仔细阅读错误信息会产生奇妙的效果,当我第一次看到那个错误时,我就这么做了。 - pmr
显示剩余5条评论
27个回答

282

注意:这并不是git的推荐用法,会覆盖远程的更改。只有当您确认本地的更改应该被推送到远程master分支时才可以使用。

⚠️ 尝试使用以下命令:git push -f origin master


56
不要尝试这样做。根据git help push的说明:“这可能导致远程仓库丢失提交记录,使用时请小心。” - jcsahnwaldt Reinstate Monica
8
绝对不要这样做。 - Lluís
20
这个方法适合我。我认为这样做没问题,因为我的Github上唯一的提交是使用新仓库创建的。也许在项目启动后不要再使用这种方法比较好。 - Matthew Moore
2
如果您想更新一个为交付目的创建的存储库(因此远程端没有新更改),这可能会很有用。 - laplasz
我刚刚使用了这个命令,因为我刚刚提交了代码,同步到了GitHub,然后又希望将另一个文件添加到该次提交中。所以我在本地撤销了该次提交,执行了上述命令来清除GitHub上的提交记录,然后再次在本地提交,最后再次同步。现在一切都好了!不过,我确信在那个分支上没有进行其他的提交。 - zeMinimalist
显示剩余6条评论

216

正如错误信息所说:在尝试 git push 之前先执行 git pull。显然你的本地分支与你的追踪分支不同步。

根据项目规则和工作流程,您可能还想使用git pull --rebase


1
自动合并 README.md 自动合并失败;请解决冲突后再提交结果。 - Asantoya17
1
@Asantoya17 远程主分支上的更改与您的更改发生了冲突。请查看文件并审查它们。然后提交解决结果。请获取教程、书籍或至少阅读消息。 - pmr
1
“Pull” 是什么意思?它使您能够将文件推送到存储库网站(例如 Bit Bucket)或从中获取和下载文件。 - David Dimalanta
7
@AndrewS git push --force origin master。如果你在生命中遇到这种问题不止一次,那么你的项目工作流程就有问题了。应该在分支中开发功能,并在合并时不进行快进操作,如果某个功能“失败”,则应还原合并提交(最好先在集成分支中进行测试,然后再将功能合并到主分支)。不过我对Eclipse不太了解。 - pmr
2
如果在执行 git pull origin trunk:master 命令时报错,应该怎么办? - Andry
显示剩余4条评论

16

我刚刚收到了这个错误。

在创建本地git仓库之后,我创建了一个github仓库,所以在将更改推送到github之前,我需要将更改合并到本地。在这种情况下,唯一的更改是在创建github仓库时作为可选步骤创建的readme文件。

git pull https://github.com/*username*/*repository*.git master

仓库链接可以在项目GitHub页面上找到:

enter image description here

然后我重新初始化了(这可能不是必需的)

git init
git add .
git commit -m "update"

然后按下:

git push

3
这个答案反映了实际情况。 - kta

15

使用以下命令:

git pull --allow-unrelated-histories <代码库的昵称> <分支名称>

例如:

git pull --allow-unrelated-histories origin master

当项目没有共同祖先时,就会出现此错误。


12
如果git pull没有帮助,那么可能是因为你推送了更改(A),然后又使用 git commit --amend 添加了一些更改(B)。因此,Git认为你可能会丢失历史记录——它将B解释为一个不同的提交,尽管它包含了A的所有更改。
如果 git pull 无法帮助,那么可能是因为您已经推送了更改(A),然后使用 git commit --amend 添加了一些其他更改(B)。 因此,Git 认为您可能会丢失历史记录 - 它将 B 解释为不同的提交,尽管它包含 A 的所有更改。
             B
            /
        ---X---A
如果在A之后没有其他人更改存储库,则可以使用git push --force命令。但是,如果其他人在A之后进行了更改:
             B
            /
        ---X---A---C

那么您必须将该人的更改从代码A变基到代码B(C→D)。

             B---D
            /
        ---X---A---C

或手动修复问题。我还没有想好如何做。


10
我在Github上创建了一个新的存储库,遇到了同样的问题,但是在拉取时也出现了问题,所以这个方法对我有用。
但是,在已经有许多代码的存储库中不建议使用此方法,因为这可能会搞乱一切。
git push origin master --force

这个答案已经给出了:https://dev59.com/iGgt5IYBdhLWcg3w8h41#16374574,并且不建议这样做。 - agold

10

我的遥控器没有和本地同步,所以这对我有用。

git pull --rebase

确保在再次执行git pull时,它应该显示Already up to date,然后您就可以准备推送到origin了。

假设您已经执行git remote add origin 远程仓库URL

执行:

git push origin master

屏幕截图已经说明了一切。 输入图像描述

或者您可以这样做

  1. git stash(暂存未提交的更改)
  2. git pull(使本地和远程同步)
  3. git stash pop(获取您未提交的更改)
  4. git push

9

警告:

执行 'git pull' 并不总是解决问题的方法,因此请谨慎操作。如果您有意更改了存储库历史记录,则可能会遇到此问题(即 Q 中提到的问题)。在这种情况下,git 会将您的历史更改与远程存储库中的新更改混淆。因此,您应该执行 git push --force,因为调用 git pull 将撤销您有意进行的所有历史更改。


8

这是因为你在主分支上进行了一些更改,所以项目要求你先拉取。如果您仍想推送更改,可以通过输入以下命令来使用强制推送:

git push -f origin master

请记得先提交您的更改:

git add .
git commit -m "Your commit message"

6

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