提交 Git 失败,"非快进更新被拒绝"。

106

我通过Git Online编辑了我的GIT存储库。在尝试推送本地代码更改后,我遇到了一个错误:

Git push failed, To prevent from losing history, non-fast forward updates were rejected.

我该如何修复这个问题?


Git 中的“快进”是什么? 的副本。 - user456814
12个回答

139

首先拉取更改:

git pull origin branch_name

1
如果这不能解决你的问题,确保你正在推送到与当前工作分支相同的分支上。使用“git status”检查你在哪个分支上。 - afilina
1
这个命令对我起作用了,但我想知道为什么这个命令不行:git pull?远程库等于 origin,所以它实际上运行的是:git pull origin。难道它不应该更新所有分支吗? - Karlen Kishmiryan

86
如果你确定要推送,可以在命令行中添加“--force”选项。例如,使用git push origin --force(我建议使用命令行,因为你能从其他用户那里获得更多支持,但这可能在SmartGit中无法实现)。有关更多信息,请参见此网站:http://help.github.com/remotes/

10
--force 可以解决你的问题,但有可能会伤害他人。应该非常谨慎(并具备知识)地使用它。 - schoetbi
8
通常来说,强制推广是一个糟糕的想法,因此该内容被评为-1。 - joshin4colours
6
+1是因为有5个人同意@joshin4colours的意见给了-1。但是,虽然强制推送并不总是最好的选择(Git通过拒绝推送来明确表明),但如果它在100%的情况下都是一个不好的选择,那么这个选项就不会存在。Matt在这里的建议肯定对其他人有用。 - Nike
3
如果你是唯一一个使用这个分支,可以放心使用 --force。但如果要与其他开发者共享一个分支,则会导致问题。 - Robert Brisita
"--force"是一种破坏性的操作,因为它会无条件地将远程仓库覆盖为本地的内容。但是,"--force-with-lease"可以确保您不会覆盖其他人的工作。更多信息请参见此处 https://dev59.com/k2w05IYBdhLWcg3w_W1O#51447578 - igorjs

27
在推送之前,使用rebase选项进行git pull操作。这将获取您在线上所做的更改(在您的源代码库中)并在本地应用它们,然后在其之上添加您的本地更改。
git pull --rebase

现在,您可以推送到远程。
git push 

更多信息请查看Git rebase explained第3.6章 Git分支 - 变基


2
在我的情况下,git pull --rebase 结果为 当前分支没有跟踪信息。请指定您想要 rebase 的分支。 - trejder

16

我遇到了相同的错误,只需要在命令中添加"--force"即可解决。

git push origin master --force

7
这会有后果吗? - jayunit100
9
失去他人提交的代码变更。 - Giovanni Toraldo
1
我遇到了一个奇怪的情况,这正是我想要做的...用新的内容清除刚创建的远程主分支的内容。这解决了我的问题。虽然这不是每个人的解决方案,但--force可能会有所帮助。 - Brad
1
我认为这个答案不应该被投票踩了6次。这是一个有效的解决方案,然而,作者在描述这个命令何时有用的情况下可以更加详细一些。如果值得编写(--force的功能),那么值得一提。 - Aiden Strydom
--force 是一种破坏性的操作,因为它会无条件地用本地的内容覆盖远程仓库。但是 --force-with-lease 可以确保你不会覆盖其他人的工作。更多信息请参见此处:https://dev59.com/k2w05IYBdhLWcg3w_W1O#51447578 - igorjs

13

解决这个问题的最安全的方法是使用--rebase

例如:

git pull <remote> <branch> --rebase

这可能会导致您本地分支中的冲突,您需要手动解决它们。

一旦您解决了所有冲突,您可以使用--force-with-lease推送您的更改。

例如:

git push <remote> <branch> --force-with-lease

使用此标志,Git 将检查分支的远程版本是否与您正在变基的版本相同,即如果在您变基时有人推送了新提交,则推送将被拒绝,您将被迫重新变基您的分支。

如果您正在处理每小时数百个提交的大型项目,则这很烦人,但仍然是解决此问题的最佳方法。

避免使用 --force,除非您确切地知道自己在做什么。

使用 --force 是具有破坏性的,因为它会无条件地用本地内容覆盖远程存储库。

但是通过 --force-with-lease,可以确保不覆盖他人的工作。

在 Atlassian 的开发者博客中查看更多信息


5
我曾经遇到过同样的问题。
问题的原因是我本地的分支不知何故丢失了远程分支的跟踪信息。

解决方法:

git branch branch_name --set-upstream-to=origin/branch_name
git pull

通过解决合并冲突,我成功地推送了代码。


看起来你错过了远程分支的更改。 - ozma

2

使用--rebase选项对我很有用。

  • git pull <remote> <branch> --rebase

然后将其推送到存储库。

  • git push <remote> <branch>

例如:

git pull origin master --rebase

git push origin master


1
Netbeans 7.1 的解决方案:尝试进行一次 pull 操作,这可能也会失败。现在查看日志(通常在 IDE 中显示)。有一行或多行说:

“由于此文件而导致拉取失败:”

搜索该文件,删除它(备份之前)。通常它是一个 .gitignore 文件,因此您不会删除代码。重新进行 push 操作。现在应该一切正常了。


0
有时,在从git拉取代码时,HEAD会变成分离状态。您可以通过输入以下命令来检查:
git branch 
  • (HEAD detached from 8790704)

    主分支

    开发分支

最好切换到您的分支,并从相应的分支进行新的拉取。

git checkout develop

git pull origin develop

git push origin develop

0

遇到了相同的问题,为了解决它,请运行以下git命令。

  • git pull {url} --rebase
  • git push --set-upstream {url} master

您必须先在Github上创建存储库。


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