Git:如何忽略快进并将原点[branch]恢复到之前的提交?

ign*_*low 8 git commit reverting

我用了

git reset --hard dc082bc... 
由于一些错误的提交,恢复到分支回到所需的先前状态.这让我当地的分公司很好.但是,我想将'origin'上的分支回滚到同一个commit,以便我可以重新开始.谁能告诉我如何将原始分支(非主人)恢复到此提交?

我已经尝试过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.

Von*_*onC 26

为了增加我之前的答案,并解决一个被迫git push可以真正搞乱其他贡献者的本地回购的事实,git 1.8.5(即将到来的2013年第四季度)将会看到一个新选项:

git push --force-with-lease
Run Code Online (Sandbox Code Playgroud)

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

如果origin你在检查它时强行或删除分支机构发生了某些事情,你最终可能会失去其他人的工作.

不知道倒带和重建分支的决定的人可能会尝试在你获取它的时间和你推迟用rebase结果替换它的时间之间推送到分支.

我们可以make these pushes safer选择允许用户告诉" git push"这个:

我正在强制/删除,基于'branch'的值仍在此对象的假设.
如果这个假设不再成立,即自从我开始准备这个推动以来分支机构发生了什么事情,请不要继续这个推动.

您可以--force-with-leasecommit 28f5d17中查看完整文档

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

目前,"一些合理的默认值"暂时定义为"我们对远程更新的ref的远程跟踪分支的值",如果我们没有这样的远程跟踪分支则是错误的.

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

" force-with-lease":当你决定重新定义历史应该是什么时,你假设你在ref上接受了租约,并且只有在租约没有被破坏时你才可以退回.


这已经在测试中,并在" git.git中的什么烹饪(2013年8月,#07;周三,28) " 中提及:

顺便说一句,超越通常的"必须快进"的推动是使用force-with-lease已经烹饪的" "选项完成的next,如下所示:

$ 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
Run Code Online (Sandbox Code Playgroud)

注意:" git push --force-with-lease"已经被教导要报告是否需要强制(或快进).

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

推送:修复参考状态报告 --force-with-lease

--force--with-lease推送选项导致小于详细的状态信息--force.
特别是,输出表明引用被快速转发,即使它是强制更新的.


请注意忽略/绕过该选项,如Git 2.13(2017年第2季度)中所述.


Von*_*onC 18

你可以尝试git push --force强制推动.

--force
Run Code Online (Sandbox Code Playgroud)

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

因此,如果很多人已经从原点撤出了同一个分支,那么这可能会导致一些反驳问题.
可以在服务器端阻止该操作,就像ebneter指出的那样(在评论中):

根据遥控器的配置,虽然,这可能无法正常工作
-我所有的中央回购的配置有receive.denyNonFastForwards = truereceive.denyDeletes = true,在这种情况下,任何此类手术必须要在远程服务器上完成.

但是,在GitHub的情况下,管理其GitHub存储库的用户无法轻易获得此类设置.
因此,如果你git push --force错了,你剩下的就是向GitHub支持打开一个案例,让他们检查他们的本地(即"GitHub")reflogs,看看他们是否可以恢复旧的提交.
(由于reflogs是局部的,就像我最近记忆.所以,提交其被新的取代过程中push --force只仍然可见,如果没有" git gc"或" git prune"已经发生了,在GitHub的服务器端)

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

如果你强行推动,这可能真的搞砸了其他贡献者的本地回购 - 虽然它只是一个必要的邪恶(我可能不得不在我使用Git的生命中这样做两次)


归档时间:

查看次数:

14253 次

最近记录:

8 年,5 月 前