【问题标题】:push changes without pull无需拉动即可推送更改
【发布时间】:2012-08-06 14:06:46
【问题描述】:

我正在尝试撤消已经推送到远程存储库的一些更改,并且我已经在本地使用

git reset --hard COMMIT-HASH

但现在它不会让我不先拉就推,这当然违背了目的。我试过了:

git push -f

出现哪些错误:

Total 0 (delta 0), reused 0 (delta 0)
remote: error: denying non-fast-forward refs/heads/master (you should pull first)
To git@xxx.beanstalkapp.com:/yyy.git
 ! [remote rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'git@xxx.beanstalkapp.com:/yyy.git'

那么我如何将新的、正确版本的分支转移到远程?

【问题讨论】:

  • this 对您有帮助吗?
  • @Hassan - 对不起,不。我已经回滚了我不想要的提交,现在问题是成功将其推送到远程。
  • 如果你已经回滚了 git 服务器上的提交,那为什么不能拉取呢?

标签: git


【解决方案1】:

来自git config 手册页:

receive.denyNonFastForwards

如果设置为 true,git-receive-pack 将拒绝不是快进的 ref 更新。使用它来防止通过推送进行此类更新,即使该推送是强制的。此配置变量在初始化共享存储库时设置。

您尝试推送到的服务器已启用此设置。所以,简短的回答是,在这种情况下你将无法git push --force


要获得正确版本的分支到远程,您必须对分支的尖端进行新的提交,使其进入正确的状态。如果您当前处于正确状态的提交状态,则可以运行以下命令:

$ git reset --soft <remote>/<branch>    # point the ref back to the remote, but
                                        #   keep the index and working tree

$ git commit                            # make the 'correction' commit
$ git push

【讨论】:

    【解决方案2】:

    您的服务器是否不允许非快进推送?

    git 配置文件

    [receive]
    denyNonFastforwards = true
    

    【讨论】:

    • 默认情况下它似乎被禁用并带有警告:“除非您知道自己在做什么,否则我们不建议更改这些设置。Beanstalk 提供了适用于大多数用户开箱即用的合理默认设置。” ...虽然启用它并强制推送确实解决了问题
    • 在使用主题分支时,强制推入除 master 以外的分支是必不可少的。合并两个分支可能会导致代码丢失,因为它只比较给定分支的提示。变基会爬取自最新共同祖先以来的所有提交并提供更好的结果,但需要重写无法通过快进处理的提交。新手 git 用户不知道什么是变基,所以这个选项对他们有好处。
    【解决方案3】:

    在 git 中撤消更改的最佳方法是使用git revert 命令。

    要撤消上一次提交: git revert HEAD^

    它将撤消上次提交中所做的更改,然后在其之上创建一个新提交。

    希望它对某人有所帮助..

    【讨论】:

      猜你喜欢
      • 2014-06-15
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多