100

我们的远程主分支不知何故搞砸了。当前的开发代码与最新的提交一起在主分支上。显然,开发代码还没有准备好用于 master 分支。

所以在我的本地存储库中,我重置了最新的标签,git reset --hard (Tag). master 分支现在在我的本地存储库上是正确的。现在,当我尝试将更改推送到远程存储库时,git push origin master出现错误:

To (REMOTE GIT REPOSITORY LOCATION)
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'
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.

所以环顾四周后,我发现了这个--force选项。所以我对远程存储库进行了强制推送,git push --force origin master但仍然出现错误:

Total 0 (delta 0), reused 0 (delta 0)
remote: error: denying non-fast-forward refs/heads/master (you should pull first)
To (REMOTE GIT REPOSITORY LOCATION)
 ! [remote rejected] master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'

我不能在 master 上做一个 pull,因为它包含不能在 master 上的开发代码。

4

10 回答 10

158

该消息意味着您不允许进行非快进推送。

您的远程存储库很可能denyNonFastforwards = true在其配置中。如果你改变它,git push --force应该工作。

要更改设置,您需要访问具有远程存储库的计算机。从那里,做git config receive.denynonfastforwards false

于 2012-05-11T01:40:23.177 回答
16

遥控器不允许非快进。

你最好的选择是git revert所有不应该存在的提交,并且在未来更加小心。

git revert [commit]将创建一个新的提交来撤消[commit]所做的一切。

于 2012-05-11T01:29:04.430 回答
12

尝试使用该-f标志并将其放在远程分支名称之后。

git push origin master -f

于 2012-05-11T01:12:14.743 回答
12

以以下方式永久启用强制推送的步骤

git push -f myrepo my-branch

在远程存储库上以“.git”结尾的文件夹中编辑名为“config”的文件

在失败推送的 git 命令行输出中,查找类似以下内容的行:

error: failed to push some refs to 'ssh://user@some-remote-server.mycompany.com/srv/git/myrepo.git

然后

ssh user@some-remote-server.mycompany.com
cd /srv/git/myrepo.git
vi config

将“denyNonFastforwards”设置为 false

在“配置”中,设置

[receive]
        denyNonFastforwards = false

现在您可以使用 -f 从本地计算机推送

git push -f myrepo my-branch
于 2016-03-25T20:31:31.093 回答
4

解决此问题的最佳方法是删除远程分支并重新发送:

git push origin master --delete
git push origin master
于 2018-09-05T18:56:47.067 回答
2

你不能做不快进的 git push 。

  1. 如果远程是 GitHub,请转到https://github.com/$USER/$REPO/settings/branches并取消保护有问题的分支。

    在此处输入图像描述

    你必须是 repo 的管理员才能做到这一点。

  2. 如果远程是您自己的 git 服务器,请在git config receive.denynonfastforwards false那里运行。

于 2016-10-25T13:14:07.730 回答
0

我通过从受保护的和默认的分支中删除主分支来解决,这在存储库的设置中刚刚超过受保护的分支规则。

于 2020-05-06T20:10:34.310 回答
0

我正在使用这组命令来重置我的远程仓库,这将重新初始化您的本地仓库并与您的远程仓库重新链接,然后强制推送更新。

我认为这种方式不适用于您的情况,但可能对其他人有用

转到源文件夹,然后运行命令:注意这https://github.com/*.git是您的远程仓库链接

git init
git remote add origin https://github.com/*.git
git add .
git commit -m "initial commit"
git push origin master -f
git push --set-upstream origin master

**Note: this will clear all your git history on your master branch**

于 2018-04-16T15:51:11.273 回答
0

出现此问题的原因是当前分支未正确配置PULL。首先使用 - 检查上游分支是否正确配置为拉取git remote show origin。您可以在 -为“git pull”配置的本地分支部分下找到它:。如果没有,请使用以下命令进行配置:

git config branch.MYBRANCH.merge refs/heads/MYBRANCH

为占位符提供适当的分支名称 - MYBRANCH

于 2016-03-03T10:55:19.603 回答
0

对我来说,@svick 的暗示指向了正确的方向。由于我要修改的 git 服务器实际上是我的盒子,所以我登录它并git config --global receive.denynonfastforwards false更改所有 repos 以接受强制的非 ff 推送。没有开箱即用。我发现在配置中已经receive.denynonfastforwards=true设置了,并且不能用git config --global --unset receive.denynonfastforwards. 但是,手动在 repo 中进行编辑 ( vi config) 是有效的。

于 2019-05-11T19:44:26.770 回答