2011-05-11 103 views
98

因此,我正在与其他人一起开展一个项目,并且有多个github正在进行工作。有人解决了一个问题,我把他的叉子合并,但后来我意识到我可以找到更好的解决方案。我想恢复我刚刚提交的提交。我试图用git revert HEAD这样做,但它给了我这个错误:为什么git回复抱怨缺少-m选项?

fatal: Commit <SHA1> is a merge but no -m option was given.

这是什么意思?当我合并并提交时,我确实使用了-m选项来说“合并< username>”。

我在这里做错了什么?

回答

107

默认情况下,git revert拒绝恢复合并提交,因为实际上这意味着模糊不清。我认为你的HEAD实际上是一个合并提交。

如果你想恢复合并提交,你必须指定你想要考虑的合并的哪一个父主干,即你想要恢复的东西。

通常这将是父头号,例如,如果你在master,做git merge unwanted,然后决定恢复的unwanted合并。第一个父母将是您的合并前master分支,第二个父母将是unwanted的小费。

在这种情况下,你可以这样做:

git revert -m 1 HEAD 
+3

好的谢谢。我发现只需更改受合并影响的两个文件,然后再提交一些其他更改也更容易。 – icnhzabot 2011-05-11 22:11:31

+19

我在哪里可以找到有关我是否必须使用-m1或-m2,...的信息? – 2016-07-18 08:51:35

+10

'git cat-file -p [MERGE_COMMIT_ID]'将按顺序显示父分支。列出的第一个是“-m 1”,第二个是“-m 2”。 – nostromo 2016-10-12 05:23:56

34

说于foo的顶部其他人创造了吧,但你创造了同时巴兹然后合并,给人

$ git lola 
* 2582152 (HEAD, master) Merge branch 'otherguy' 
|\ 
| * c7256de (otherguy) bar 
* | b7e7176 baz 
|/ 
* 9968f79 foo
历史

注:git lola是一个非标准但有用的别名。

git revert没有骰子:

$ git revert HEAD 
fatal: Commit 2582152... is a merge but no -m option was given.

查尔斯·贝利发表了excellent answer如常。使用git revert

$ git revert --no-edit -m 1 HEAD 
[master e900aad] Revert "Merge branch 'otherguy'" 
0 files changed, 0 insertions(+), 0 deletions(-) 
delete mode 100644 bar

有效地删除bar和产生的

$ git lola 
* e900aad (HEAD, master) Revert "Merge branch 'otherguy'" 
* 2582152 Merge branch 'otherguy' 
|\ 
| * c7256de (otherguy) bar 
* | b7e7176 baz 
|/ 
* 9968f79 foo

历史,但我怀疑你想扔掉这次合并提交:

$ git reset --hard HEAD^ 
HEAD is now at b7e7176 baz 

$ git lola 
* b7e7176 (HEAD, master) baz 
| * c7256de (otherguy) bar 
|/ 
* 9968f79 foo

作为记录git rev-parse manual

<rev>^ , e.g. HEAD^, v1.5.1^0
A suffix ^ to a revision parameter means the first parent of that commit object. ^<n> means the n-th parent (i.e.<rev>^ is equivalent to <rev>^1). As a special rule, <rev>^0 means the commit itself and is used when <rev> is the object name of a tag object that refers to a commit object.

所以调用之前git resetHEAD^(或HEAD^1)为b7e7176和HEAD^2是c7256de,,分别合并的第一和第二父母提交。

小心git reset --hard因为它可以摧毁工作。

+2

这是一个混乱起来,混乱起来,震动世界。除了萝拉。感谢百万这个奇妙的别名。 – Barney 2016-01-28 14:52:22

3

我有这个问题,解决方法是看提交图(用gitk来),看看我有以下几点:

* commit I want to cherry-pick (x) 
|\ 
| * branch I want to cherry-pick to (y) 
* | 
|/ 
* common parent (x) 

我现在明白了,我想要做的

git cherry-pick -m 2 mycommitsha 

这是因为-m 1将基于共同的父母进行合并,其中-m 2基于分支y合并,这是我想要挑选的分支。

+0

有人可以评论他们为什么downvoted这个? – shmish111 2016-04-13 10:06:35

+0

可能是因为它与'git-revert'没有关系,这是这个问题的关键。 – pnomolos 2016-05-09 16:52:02

+0

我认为这个问题是关于'-m'选项的,不是专门关于'git merge'的。也就是说,使用'-m'选项背后的原因看起来与恢复和樱桃选择类似。如果不是这样,请告诉我们。由于我没有发现任何其他问题,特别是樱桃挑选使用它,感谢这个答案,这可能导致谷歌帮助我找到这个问题和有用的,相关的讨论! – nealmcb 2017-11-30 15:54:23

相关问题