为什么git回复抱怨缺less-m选项?

所以我正在和其他人一起开发一个项目,而且还有很多github正在开发。 有人刚刚解决了一个问题,我与他的叉合并,但后来我意识到,我可以find一个更好的解决scheme。 我想恢复我刚刚提交的提交。 我试图用git revert HEAD但它给了我这个错误:

 致命的:提交<SHA1>是一个合并,但没有-m选项被给出。 

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

我在这里做错了什么?

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

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

通常这将是第一个父母,例如,如果你是master ,并做了git merge unwanted ,然后决定恢复unwanted的合并。 第一个父母是你的预合并master分支,第二个父母是unwanted

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

 git revert -m 1 HEAD 

说另一个人在foo之上创造了酒吧,但是你同时创造了baz然后合并了,给了一个历史

  $ git lola
 * 2582152(HEAD,master)合并分支'otherguy'
 | \  
 |  * c7256de(otherguy)吧
 * |  b7e7176 baz
 | /  
 * 9968f79 foo 

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

没有骰子与git revert

  $ git还原HEAD
致命的:提交2582152 ...是一个合并,但没有-m选项被给出。 

查尔斯·贝利像往常一样给出了很好的答案 。 使用git revert

  $ git revert --no-edit -m 1 HEAD
 [master e900aad]还原“合并分支”otherguy'“
  0个文件已更改,0个插入(+),0个删除( - )
 删除模式100644吧 

有效删除bar并生成历史logging

  $ git lola
 * e900aad(HEAD,master)还原“合并分支”otherguy'“
 * 2582152合并分支'otherguy'
 | \  
 |  * c7256de(otherguy)吧
 * |  b7e7176 baz
 | /  
 * 9968f79 foo 

但我怀疑你想扔掉合并提交:

  $ git reset --hard HEAD ^
 HEAD现在在b7e7176 baz

 $ git lola
 * b7e7176(HEAD,硕士)baz
 |  * c7256de(otherguy)吧
 | /  
 * 9968f79 foo 

正如git rev-parse手册中所logging的那样

<rev>^ ,例如HEAD ^, v1.5.1^0
修改参数的后缀^表示该提交对象的第一个父代。 ^<n>表示第n个父( <rev>^相当于<rev>^1 )。 作为特殊规则, <rev>^0表示提交本身,当<rev>是引用提交对象的标记对象的对象名称时使用。

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

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

我有这个问题,解决scheme是看看提交图(使用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会根据公用父项进行合并,其中as -m 2基于分支y进行合并,也就是我要挑选的那个。