如何强制将重置推送到远程存储库?


94

我们的远程主分支弄乱了。当前的开发代码与最新的提交均在master分支上。显然,开发代码尚未准备好用于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进行处理,因为它包含不能在master上的开发代码。


3
我认为该消息意味着您无权进行非快速推送。
2012年

3
您说得对,谢谢。在远程存储库的配置文件中,denyNonFastforwards = true。我将其更改为false,推送了更改,然后将其更改为true。再次感谢大家的帮助。
samwell

2
@samwell,请将svick的回答标记为已接受
hultqvist 2013年

@samwell svick的答案对您有用吗?
Songo 2014年

对于那些需要像samwell一样禁用denyNonFastForwards的细节的人,可以在这里找到更多说明:stackoverflow.com/a/43721579/2073804
ron190

Answers:


152

该消息表示不允许您进行非快进推送。

您的远程存储库最有可能denyNonFastforwards = true在其配置中。如果您更改它,git push --force应该可以。

要更改设置,您需要使用远程存储库访问计算机。从那里开始git config receive.denynonfastforwards false


1
您可以git config为服务器做一个吗?也许您是在隐喻地使用它。为了发挥这些想法,我在/opt/git(我的git服务器空间)中创建了一个测试仓库,然后在中修改了此设置/opt/git/the_repo/the_repo.git/config。但是一旦完成git push --force origin SHA:branch就可以按要求工作了。
HankCa

4
错误消息的行以“错误:无法将某些引用推送到<您的存储库>”开头,其中<您的存储库>是以.git结尾的路径,该目录包含一个名为“ config”的文件。这种“配置”文件中,您可以设置denyNonFastforwards =假
金刚砂

1
@emery的评论很有价值。有时,服务器上的文件夹会将其原始设置为/srv/git/repo.git。这是设置了denyNonFastForwards的配置,而不是应用程序文件夹。
伊利亚·林恩

1
@hsalimi如果您无权访问服务器,则需要联系服务器管理员,并让他们暂时将其关闭,以便您可以强制推动然后将其重新打开。尽管大多数人不太可能做到这一点。在内部环境中,您自己的托管团队可能更常见。
Elijah Lynn

1
最初这令人沮丧,但是它的优点是:默认情况下完全保护了遥控器,并且如果您作为开发人员有意并正确地进行了基准调整,则可以覆盖此配置以允许危险的行为。basing是每个git用户都应该知道的方法-知道什么时候不应该做。 DOC1 DOC2
moodboom

15

遥控器不允许非快进。

最好的选择是处理git revert所有不应该存在的提交,并在以后更加谨慎。

git revert [commit]将创建一个撤消所有操作的新提交[commit]


远程存储库中的某些设置阻止了所有非快进更改。
samwell

如果您这样做并且需要重新应用提交,则不会在历史记录中删除历史记录,而只是更改代码,并且您将无法挑选提交或进行合并
mtpultz

12

永久启用以下样式的推力的步骤

git push -f myrepo my-branch

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

在git push的失败推送命令行输出中,查找如下所示的行:

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

如何在不访问SSH的情况下做到这一点?
弗拉基米尔·武卡纳克(Fladimir Vukanac)

也许按照richo的建议使用git revert命令?如果首先备份存储库的当前状态,则仍然可以合并代码以继续进行。
金刚砂

git revert合并时有点复杂。更复杂的是,我的案例有3个合并,其中一个与非常老的〜20个commit从开发中分离出来,第二个是来自大师的合并-丑陋的地狱。
弗拉基米尔·武卡纳克(Fladimir Vukanac)

1
也许解决方案是将其重置为所需的状态,进行备份(存储),再次拉出,然后应用备份(存储)。
弗拉基米尔·武卡纳克(Fladimir Vukanac)

1
mrW您仍然可以在还原/拉动的代码库之上合并所需的代码库
Emery

11

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

git push origin master -f


1
不,那也不起作用。我也尝试过git push -f origin master和同样的结果。两次尝试都得到了错误消息的第二个版本。
samwell

2

不允许您执行不快进的git push。

  1. 如果远程站点是GitHub,请转到https://github.com/$USER/$REPO/settings/branches并取消保护相关分支。

    在此处输入图片说明

    您必须是仓库的管理员才能执行此操作。

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


请注意,对于Git Hub Enterprise实例,可以在实例级别禁用到默认分支的推送(通常是“ master”)。这意味着,即使“ master”不受保护,并且即使您是站点管理员,也将无法对默认分支进行强制推送。假设您具有权限,则可以通过将默认分支切换到其他分支,强制执行然后再切换回来来暂时解决此问题。
克里斯托弗·亨特


0

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

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

为占位符指定适当的分支名称-MYBRANCH


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**


0

对我而言,@ svick的提示指向正确的方向。由于我要修改的git服务器实际上是我的盒子,因此我登录到它,并做了一个git config --global receive.denynonfastforwards false更改所有存储库以接受强制非ff推送的操作。开箱即用。我发现在配置中已经receive.denynonfastforwards=true设置好了,无法使用擦除它git config --global --unset receive.denynonfastforwards。不过,在仓库中手动进行编辑(vi config)可以。


0

我通过从受保护的默认分支中删除了master分支来解决此问题,这也是在设置存储库时超出了受限制的分支规则。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.