2012-01-04 129 views
230

鉴于使用commit承诺进行了更改,然后使用revert进行了恢复,那么撤消该恢复的最佳方法是什么?如何“取消还原”还原的Git提交?

理想情况下,应该使用新的提交来完成,以免重写历史记录。

+53

不恢复恢复工作? – Mat 2012-01-04 14:00:47

+2

[我该如何修复还原的git commit?](http:// stackoverflow。com/questions/5354682/how-can-i-fix-a-reverted-git-commit) – 2017-04-11 12:14:12

回答

205

如果你还没有推这种变化的是,git reset --hard HEAD^

否则,恢复的复归是完全正常的。另一种方法是git checkout HEAD^^ -- .然后git add -A && git commit

+0

请注意,如果您想要在没有立即将原始更改应用于主分支的情况下取消还原,您可以(1) (2)点击亚当注意到的回复分支**上的“回复”**,然后(3)在结果PR的标题中单击“编辑”并将目标分支改为原始分支主人。现在您的原始分支可以重新合并以实现先前还原的更改。 – pauljm 2014-09-26 16:01:58

+2

谢谢。我刚刚恢复了原来的恢复,并且工作正常。 – Simon 2014-10-17 17:35:35

+0

是的,恢复恢复的提交类似于恢复提交。谢谢! – 2015-03-26 16:16:25

216

git cherry-pick <original commit sha>
将使原有的副本提交,基本上是重新申请的提交

还原的还原会做同样的事情,有一个混乱的提交信息:
git revert <commit sha of the revert>

无论是的这些方法将允许您在不覆盖历史的情况下登录git push,因为它会在还原后创建新的提交。
当键入犯煞,你通常只需要前5个或6个字符:
git cherry-pick 6bfabc

+24

这是OPs问题的最优雅和最完整的解决方案。比接受的答案好得多,它是关于提交树的HEAD处的恢复提交的假设。该运营商还特别要求提供不重写历史记录的解决方案,因此在接受的答案中提供的硬解决方案完全错误。 – Timo 2015-10-22 10:39:30

+1

当我有合并提交时,这不适用于我。 – 2017-02-24 15:40:15

+0

非常感谢。这节省了很多压力! – SwimmingG 2017-05-25 23:46:29

2

它看起来愚笨,对我来说。但是我一直处于同样的状况,而且我还是回复了提交的提交。我做了数字还原,所以我必须为每个'还原提交'做出还原。

现在我的提交历史看起来有点奇怪。

weird history

这是一个宠物项目,所以它是确定。但是对于现实生活中的项目,我会优先选择上次提交,然后再恢复所有已恢复的代码。

+3

您可能会对我的另一个问题的答案感兴趣:http://stackoverflow.com/questions/10415565/how-to-revert-multiple-commits-as-part-of-a-single-commit – JimmidyJoo 2015-09-24 14:14:52

+1

您可以避免自动提交,并在恢复时使用--no-commit标志选择提交消息,然后提交相关消息 – 2017-07-16 06:09:20

0

如果你不喜欢“恢复还原”的想法(特别是当这意味着丢失许多提交的历史信息),你总是可以前往关于"Reverting a faulty merge"的git文档。

鉴于下列初始状态

P---o---o---M---x---x---W---x 
    \  /
    A---B---C----------------D---E <-- fixed-up topic branch 

(W是你的合并M的初始复归; d和E是修复您最初破碎特性分支/提交)

现在,您可以简单地重放提交A至E,使他们没有“属于”还原后的合并:

$ git checkout E 
$ git rebase --no-ff P 

您的分支的新副本,现在可以合并为master股份公司ain:

A'---B'---C'------------D'---E' <-- recreated topic branch 
/
P---o---o---M---x---x---W---x 
    \  /
    A---B---C----------------D---E