【问题标题】:How to force push a reset to remote repository?如何强制将重置推送到远程存储库?
【发布时间】:2012-05-19 14:58:37
【问题描述】:

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

所以在我的本地存储库中,我重置了最新的标签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 上的开发代码。

【问题讨论】:

  • 我认为该消息意味着您无权进行非快进推送。
  • 你是对的,谢谢。在远程存储库的配置文件中,denyNonFastforwards = true。我将其更改为 false,推送我的更改,然后将其更改回 true。再次感谢大家的帮助。
  • @samwell 请将 svick 的回答标记为已接受
  • @samwell svick 的回答对你有用吗?
  • 对于那些需要详细了解如何像 samwell 那样禁用denyNonFastForwards 的人,可以在此处找到更多说明:stackoverflow.com/a/43721579/2073804

标签: git


【解决方案1】:

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

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

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

【讨论】:

  • 你能为服务器做一个git config 吗?或者,也许你是在比喻使用它。为了实现这些想法,我在/opt/git(我的 git 服务器空间)中创建了一个测试存储库,然后我在/opt/git/the_repo/the_repo.git/config 中修改了这个设置。但是一旦完成,git push --force origin SHA:branch 就会按要求工作。
  • 错误消息会有一行以“error: failed to push some refs to ”开头,其中 是以 .git 结尾的路径,它是一个包含文件的目录称为“配置”。这个“配置”文件是你可以设置denyNonFastforwards = false的地方
  • @emery 的评论很有价值。有时,服务器上的文件夹会将其来源设置为 /srv/git/repo.git 之类的东西。这是设置了denyNonFastForwards 的配置,而不是应用程序文件夹。
  • @hsalimi 如果您无权访问服务器,那么您需要联系服务器管理员并让他们暂时关闭它,以便您可以强制推送然后重新打开它。不过,大多数人不太可能做到这一点。在您自己的托管团队的内部环境中,这可能更常见。
  • 这最初令人沮丧,但它的美妙之处在于:默认情况下,远程完全受到保护,如果您作为开发人员有意且正确地进行变基,则可以覆盖此配置以允许危险行为。变基是每个 git 用户都应该知道的事情——并且知道什么时候不该做。 doc1doc2
【解决方案2】:

遥控器不允许非快进。

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

git revert [commit] 将创建一个新的提交,以撤消 [commit] 所做的任何事情。

【讨论】:

  • 是远程存储库上的一些设置阻止了所有非快进更改。
  • 如果您这样做并且需要重新应用提交,则历史不会在还原时仅删除代码更改,并且您将无法挑选提交或合并
【解决方案3】:

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

git push origin master -f

【讨论】:

  • 不,那也没用。我也试过git push -f origin master 和同样的结果。两次我都尝试过,我得到了第二个版本的错误消息。
【解决方案4】:

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

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

【讨论】:

  • 如何在不通过 SSH 访问裸 git repo 的情况下执行此操作?
  • 也许像 Richo 建议的那样使用 git revert 命令?如果您先备份 repo 的当前状态,您仍然可以合并您的代码以继续前进。
  • git revert 在您进行合并时有点复杂。更复杂的是,我的案例有 3 个合并,其中一个是非常老的 ~20 提交与开发不同,第二个是从 master 合并 - 丑得要命。
  • 也许解决方案是重置为所需状态,备份(存储),再次拉取,然后应用备份(存储)。
  • mrW 你仍然可以将你想要的代码库合并到一个恢复/拉取的代码库上
【解决方案5】:

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

git push origin master --delete
git push origin master

【讨论】:

    【解决方案6】:

    你不能做非快进的 git push。

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

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

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

    【讨论】:

    • 请注意,对于 Git Hub Enterprise 实例,可以在实例级别禁用推送到默认分支(通常是“master”)。这意味着即使“master”不受保护,即使您是站点管理员,您也无法强制推送到默认分支。假设您有权限,您可以通过将默认分支切换到其他分支,执行强制推送,然后切换回来来临时解决此问题。
    【解决方案7】:

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

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

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

    【讨论】:

      【解决方案8】:

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

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

      转到源文件夹,然后运行命令: 请注意,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**

      【讨论】:

        【解决方案9】:

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

        【讨论】:

          【解决方案10】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-07-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-22
            • 2021-06-11
            相关资源
            最近更新 更多