2012-07-30 62 views
58
develop branch 
--> dashboard (working branch) 

我用git merge --no-ff develop合并任何上游变为仪表板回滚一个Git合并

git的日志:

commit 88113a64a21bf8a51409ee2a1321442fd08db705 
Merge: 981bc20 888a557 
Author: XXXX <> 
Date: Mon Jul 30 08:16:46 2012 -0500 

    Merge branch 'develop' into dashboard 

commit 888a5572428a372f15a52106b8d74ff910493f01 
Author: root <[email protected]> 
Date: Sun Jul 29 10:49:21 2012 -0500 

    fixed end date edit display to have leading 0 

commit 167ad941726c876349bfa445873bdcd475eb8cd8 
Author: XXXX <> 
Date: Sun Jul 29 09:13:24 2012 -0500 

合并有大约50 +提交在里面,我想知道如何只是恢复合并,所以仪表板返回到合并前的状态

这是第二部分,如果我没有合并--no-ff,我没有得到提交'合并分支'开发'到仪表板'..我将如何滚动合并回来?

+2

[撤消Git合并?](http://stackoverflow.com/q/2389361/456814)可能有重复。 – 2014-07-07 04:45:53

回答

118

还原合并提交了详尽的覆盖other questions.当你做一个快进合并,你描述的第二个,你可以使用git reset找回以前的状态:

git reset --hard <commit_before_merge> 

你可以找到<commit_before_merge>git refloggit log,或者,如果你感觉MOXY(和没有做过别的):git reset --hard [email protected]{1}

+4

感谢您的快速回复..看着git日志,合并之前的提交是50+提交回来,因为git合并开发实际上提交了所有其他提交。我想我没有得到的是,如果我不知道什么/在哪里合并 - 我怎么找到它?你提到找到commit_before_merge ..我想我不理解那部分 – cgmckeever 2012-07-30 13:42:30

+2

看起来像使用git reflog看起来像它总结了最好的头很好,并让我知道我需要重置到哪里。 git日志似乎有太多的粒度来查明重置位置。谢谢 – cgmckeever 2012-07-30 13:53:48

+0

是的,'reflog'是一个救生员。 'HEAD @ {1}'只是描述HEAD的第二个最新状态,或者更具体地说:“后缀为@的后缀@和括号中包含的序号规范(例如{1},{15})指定该参考的第n个先前值“。 – Christopher 2012-07-30 14:22:46

9

只需重置与git reset --hard HEAD^合并提交。

如果你使用--no-ff git总是创建一个合并,即使你之间没有提交任何东西。如果没有--no-ff git就会快速前进,这意味着你的分支HEAD将被设置为合并分支的HEAD。要解决此问题,请查找要恢复的提交ID并git reset --hard $COMMITID

+0

如果您在合并之前不知道提交,那么这是一个很好的解决方案。 – iglesiasedd 2017-01-26 22:07:37

2
git reset -m 1 88113a64a21bf8a51409ee2a1321442fd08db705 

但可能有unexp副作用。参见git-scm.com/docs/git-revert

- 基本父母号选项也许一个残酷而有效的方法是检出该提交的左侧父项,复制所有文件,再次检出HEAD,并将所有内容替换为旧文件。然后git会告诉你什么是回滚,你创建你自己的回复提交:)!

+1

+1,因为这个答案不会像重置一样混淆历史记录(如果您已经推送到远程,这一点非常重要)。但是我应该期待什么样的意想不到的副作用? – pedromanoel 2015-08-24 13:59:51

+0

这是你提到的副作用吗? '恢复合并提交声明你永远不会想要合并引入的树更改。因此,稍后的合并只会引入不是先前还原合并的祖先的提交引入的树更改。这可能是也可能不是你想要的。“ – pedromanoel 2015-08-24 14:03:13

22

从这里:

http://www.christianengvall.se/undo-pushed-merge-git/

git revert -m 1 <merge commit hash> 

混帐复归增加了一个新的提交是回滚指定的提交。

使用-m 1告诉它,这是一个合并,我们想要回滚到master分支上的父提交。您将使用-m 2来指定开发分支。

+6

请注意,在此之后,您不能重新合并分支,如文档所述:”恢复合并提交声明,您将永远不希望合并中引入的树更改。结果,后来的合并只会引入由不是先前还原合并的祖先提交引入的树更改,这可能是也可能不是你想要的。“ – 2015-11-12 09:44:27

+1

@DaliborKarlović这句话有点苛刻。你以后肯定会带回这些变化,诀窍是恢复恢复提交。更多信息[这里](https://git-scm.com/blog/2010/03/02/undoing-merges.html)中的“恢复恢复” – Hilikus 2016-11-01 18:15:06