2012-05-11 85 views
69

我们的远程主分支莫名其妙地搞砸了。当前的开发代码与最新的提交一起在主分支上。显然,开发代码尚未准备好用于主分支。如何强制将重置推送到远程存储库?

因此,在我的本地存储库中,我重置了最新的标记git reset --hard (Tag)。主分支现在在我的本地存储库上正确。现在,当我尝试推到远程存储库,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)' 

我不能做一个拉的高手,因为它包含了开发代码不能上主。

+2

我认为这个消息意味着你没有权利做非快进推送。 – svick

+1

你是对的,谢谢。在远程存储库的配置文件中,'denyNonFastforwards = true'。我将它更改为false,推送了我的更改,然后将其更改为true。再次感谢所有人,寻求帮助。 – samwell

+2

@samwell请将svick的答案标记为已接受 – hultqvist

回答

9

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

git push origin master -f

+0

不,也没有工作。我也尝试过'git push -f origin master'和相同的结果。两次我尝试了我得到了第二个版本的错误信息。 – samwell

13

远程不允许非快进。

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

git revert [commit]将创建一个新的提交,以解除[commit]所做的任何操作。

+0

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

111

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

您的远程存储库极有可能在其配置中为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 = false – emery

+0

@emery的地方,但是如果有人无法访问服务器? – hsalimi

0

由于当前分支没有正确配置为PULL而出现问题。 首先使用 - git remote show origin检查上游分支是否被正确配置。您可以在部分 - 配置为'git pull'的本地分支中找到它:。如果没有,用它配置:

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

的占位给予适当的分行名称 - MYBRANCH

+1

它没有解决禁止快进推送。 –

9

步骤永久在下面的样式让力推

git push -f myrepo my-branch 

编辑名称为“config”的文件夹以“”结尾。混帐 “在你的远程仓库

在从失败的推Git的输出命令行,寻找说像行:

error: failed to push some refs to 'ssh://[email protected]/srv/git/myrepo.git 

然后

ssh [email protected] 
cd /srv/git/myrepo.git 
vi config 

集” denyNonFastforwards “为假

在”config“中,设置为

[receive] 
     denyNonFastforwards = false 

现在你可以从你的本地计算机与推-f

git push -f myrepo my-branch 
+0

如何在不访问SSH的情况下做到这一点,以裸Git回购? –

+0

也许使用git revert命令,正如richo建议的那样?如果您先备份回购的当前状态,则仍然可以将代码合并到前进中。 – emery

+0

当你合并时,'git revert'有点复杂。更复杂的是我的情况有3个合并,其中一个是非常老的〜20个不同于开发的提交,2个是来自主 - 丑的合并。 –

2

不允许你这样做混帐推,是不是快进。

  1. 如果遥控器是GitHub上,去https://github.com/$USER/$REPO/settings/branches和未保护的分支问题。

    enter image description here

    你必须要回购的管理员这样做。

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

+0

请注意,对于Git Hub Enterprise实例,可以在实例级别禁用默认分支(通常为“master”)。这意味着即使“主”不受保护,并且即使您是站点管理员,也无法对默认分支执行强制推送。假设你有权限,你可以通过将默认分支切换到别的东西来暂时解决这个问题,执行你的强制推送,然后切换回来。 –

相关问题