Git:如何忽略快进和恢复原点[分支]提前提交?

我用了

git reset --hard dc082bc... 
由于一些错误的提交,将分支恢复到所需的先前状态。 这已经让我的本地分支倒退了。 但是,我想将'origin'上的分支倒回到同一个提交中,以便我可以重新开始。 任何人都可以告诉我如何将原始分支(而不是主分支)还原为此提交?

我试过git push origin master,但是它给出了以下错误

 ! [rejected]        branch -> branch (non-fast-forward)
error: failed to push some refs to 'git@github.com:xxx/xxx.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'Note about
fast-forwards' section of 'git push --help' for details.

你可以试试git push --force来强制推送。

--force

通常,该命令拒绝更新远程ref,该远程ref不是用于覆盖它的本地ref的祖先。 此标志禁用检查。
这会导致远程存储库丢失提交; 小心使用它。

因此,如果很多人已经从原产地拉出同一个分支,那么他们可能会在他们身上造成一些重组问题。
该操作可以在服务器端被阻止,就像ebneter指出的那样(在注释中):

然而,根据远程配置的方式,这可能不起作用
- 我的所有中央receive.denyNonFastForwards = true都配置了receive.denyNonFastForwards = truereceive.denyDeletes = true ,在这种情况下,必须在远程服务器上完成任何此类手术。

但是,就GitHub而言,这些设置对于管理其GitHub仓库的用户来说并不容易。
因此,如果你误解了git push --force ,那么你只需要向GitHub支持打开一个案例,让他们检查他们的本地(即“GitHub”)reflog,看看他们是否可以恢复旧的提交。
(因为reflog是本地的,就像我最近记得的那样,所以在push --force期间被新的替换的提交只有在GitHub没有' git gc '或' git prune '时才能看到服务器端)

所以Marco Ceppi坚持(在评论中):

如果你强行推送,这可能会让其他贡献者的本地回购混乱真的变得很糟糕 - 虽然有些时候它只是一个必要的恶魔(在我使用Git的生命周期中,我可能不得不这样做两次)


为了补充我以前的回答,并解决强迫git push可能会使其他贡献者的本地回购混乱的事实,git 1.8.5(即将于2013年第四季度发布)将会看到一个新选项:

git push --force-with-lease

在该主题中查看该选项的来源:

如果你在提取或检查它时检查到的分支发生了“ origin ”,那么最终可能会失去其他人的工作

有人不知道倒带和重建分支的决定可能会尝试在您获取重新绑定分支的时间和您推动替换分配的结果之间推送分支。

我们可以通过选择性地允许用户告诉“ git push ”这个来make these pushes safer

我强制/删除,基于'分支'的值仍然在这个对象的假设。
如果这个假设不再成立,也就是说,如果自从我开始准备这次推送以来,分支机构发生了什么事情,请不要继续并推迟这一推测。

您可以在提交28f5d17中看到--force-with-lease的完整文档

--force-with-lease将通过要求其当前值与某些合理的默认值相同来保护将要更新的所有远程引用,除非另有规定;

目前,“一些合理的默认值”暂时定义为“远程跟踪分支的值被更新”,如果我们没有这样的远程跟踪分支,这是一个错误。

这解释了该选项的“租赁”部分:

force-with-lease ”:假设你在参考资料时考虑了租约,以决定重新发售的历史应该是什么,并且只有在租约未被破坏的情况下才能推回。


这已经被测试,并在“git.git(2013年8月,#07;周三,28)的烹饪内容”中提到:

顺便说一下,超越通常的“必须快进”的推动是通过使用next正在烹饪的“ force-with-lease ”选项完成的,如下所示:

$ git fetch ko next
$ anchor=$(git rev-parse --verify FETCH_HEAD)
$ for remote in ko repo gph github2
  do
    git push --force-with-lease=refs/heads/next:$anchor $remote next
  done

注意:“ git push --force-with-lease ”已被教导报告是否需要强制(或快速转发)的推送。

所以这个命令在使用git 2.8的输出中更加详细(2016年3月)

推送:修复ref的状态报告 - for --force-with-lease

--force--with-lease推送选项会导致比--force更少的详细状态信息。
特别是,输出表明参考文件被快速转发,即使在强制更新时也是如此。


如Git 2.13(2017年第2季度)所述,谨防这种选择被忽略/绕过。

链接地址: http://www.djcxy.com/p/48979.html

上一篇: Git: How to ignore fast forward and revert origin [branch] to earlier commit?

下一篇: Curl PUT is not working as expected for updating branch protection on github