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


183

因此,我正在与其他人一起开发一个项目,并且正在处理多个github分支。有人刚刚解决了一个问题,于是我与他的叉子合并,但后来我意识到我可以找到更好的解决方案。我想还原刚才所做的提交。我尝试这样做,git revert HEAD但它给了我这个错误:

致命:提交<SHA1>是合并,但未提供-m选项。

那是什么意思?合并并提交后,确实使用了-m选项来表示“与<username>合并”。

我在这里做错了什么?

Answers:


216

默认情况下,git revert拒绝还原合并提交,因为这实际上是含糊的。我认为您HEAD实际上是一个合并提交。

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

通常,这将是第一个父级,例如,如果您曾经参加过,master并且做了git merge unwanted,然后决定还原的合并unwanted。第一个父级是您的合并前master分支,第二个父级是的提示unwanted

在这种情况下,您可以执行以下操作:

git revert -m 1 HEAD

4
好,谢谢。我发现仅更改受合并影响的两个文件,然后再提交其他一些更改就更容易了。
icnhzabot,2011年

42
在哪里可以找到必须使用-m1或-m2,...的信息?
Patrick Cornelissen

34
git cat-file -p [MERGE_COMMIT_ID]将按顺序显示父分支。列出的第一个-m 1是第二个-m 2
nostromo

2
git revert [HASH] -m 2告诉我在分支1.x-1.x上没有任何要提交的内容,工作目录很干净,但我的提交未还原。
jenlampton

3
因此,如果我需要恢复过去的10次合并(这很可能是因为git每当我从另一位开发人员处获取更改时都会自动执行合并),我是否必须为每个合并执行此操作?这就是为什么git粉丝如此热衷于rebasing,因为revert基本没用吗?
Neutrino

45

假设另一个人在foo之上创建了bar,但是您同时创建了baz,然后合并了,

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

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

没有骰子git revert

$ git revert HEAD
致命的:Commit 2582152 ...是合并,但未提供-m选项。

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

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

有效删除bar并产生历史记录

$ git lola
* e900aad(HEAD,主)恢复“合并分支'otherguy'”
* 2582152合并分支'otherguy'
| \  
| * c7256de(otherguy)栏
* | b7e7176 baz
| /  
* 9968f79 foo

但是我怀疑您想丢弃合并提交:

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

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

手册中所述git rev-parse

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

因此,在调用之前git resetHEAD^(或HEAD^1)是b7e7176和HEAD^2c7256de,分别是合并提交的第一和第二个父级。

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


3
这是一个混杂,混乱,震惊的世界。除了萝拉。感谢一百万为这个梦幻般的别名。
巴尼

添加lola到git命令的简单方法:git config --global alias.lola "log --graph --decorate --pretty=oneline --abbrev-commit --all"
D. Gibbs,

8

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


1
可能是因为它与无关git-revert,这是此问题的原因。
pnomolos's

1
我认为这个问题是关于-m选项的,而不是唯一的git merge。也就是说,使用该-m选项的原因似乎与还原和小插曲相似。如果那不是真的,请告诉我们。由于我还没有找到其他任何专门解决该问题的方法,感谢您的回答,这可能导致google帮助我找到了这个问题和有用的,相关的讨论!
nealmcb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.