为什么git revert抱怨缺少-m选项?

时间:2011-05-11 21:34:31

标签: git github git-revert

所以我正在与其他人一起开展一个项目,并且正在开发多个github forks。有人刚刚修复了一个问题并且我与他的分叉合并,但后来我意识到我可以找到更好的解决方案。我想恢复我刚刚提交的提交。我尝试使用git revert HEAD执行此操作,但它给了我这个错误:

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

这是什么意思?当我合并并提交时,我确实使用-m选项说“Merged with&lt; username&gt;”。

我在这里做错了什么?

4 个答案:

答案 0 :(得分:149)

默认情况下,git revert拒绝恢复合并提交,因为实际意味着不明确。我假设您的HEAD实际上是合并提交。

如果要还原合并提交,则必须指定要将合并的哪个父级视为主干,即要恢复到的内容。

通常这将是父母第一,例如,如果您在master并且git merge unwanted,然后决定还原unwanted的合并。第一个父级将是您的合并前master分支,第二个父级将是unwanted的小费。

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

git revert -m 1 HEAD

答案 1 :(得分:39)

说另一个人在foo之上创建了栏,但你在此期间创建了baz然后合并,给出了历史

$ 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.

Charles Bailey像往常一样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>^,例如HEAD ^,v1.5.1^0
  修订参数的后缀^表示该提交对象的第一个父级。 ^<n>表示 n -th parent( ie。 <rev>^等同于<rev>^1)。作为一项特殊规则,<rev>^0表示提交本身,并在<rev>是引用提交对象的标记对象的对象名时使用。

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

小心git reset --hard因为它会破坏工作。

答案 2 :(得分:5)

我遇到了这个问题,解决方案是查看提交图(使用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合并,这是我想要挑选的那个。

答案 3 :(得分:0)

在原始问题中,git 错误的“-m 选项”可能被误认为是表示提交消息。如其他答案中所述,使用“-m n”指定合并的第 n 个父级以选择您认为是主干的父级。