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

icn*_*bot 156 git github git-revert

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

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

那是什么意思?当我合并并提交时,我确实使用-m选项说"Merged with <username>".

我在这做错了什么?

CB *_*ley 179

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

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

通常这将是父母第一,例如,如果你在上master并且做了git merge unwanted然后决定恢复合并unwanted.第一个父级将是您的合并前master分支,第二个父级将是unwanted.

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

git revert -m 1 HEAD
Run Code Online (Sandbox Code Playgroud)

  • 我在哪里可以找到有关是否必须使用-m1或-m2,...的信息? (38认同)
  • `git cat-file -p [MERGE_COMMIT_ID]`将按顺序显示父分支.列出的第一个是`-m 1`,第二个是`-m 2`. (28认同)
  • 好,谢谢.我发现只更改受合并影响的两个文件然后提交我的其他一些更改也更容易. (4认同)
  • “这实际上意味着什么是不明确的” - 我不同意。如果我在“branch-b”上并合并来自“branch-a”的一些提交,这会导致“branch-b”上的内容被修改,而“branch-a”上的内容没有修改。在这种情况下,“恢复”唯一有意义的意思是“撤消对`branch-b`所做的修改”。歧义为零。 (3认同)
  • git revert [HASH] -m 2告诉我在分支1.x-1.x上没有要提交的内容,工作目录很干净,但是我的提交没有恢复。 (2认同)
  • 因此,如果我需要恢复过去的10次合并(这很可能是因为git每当我从另一位开发人员处获取更改时都会自动执行合并),我是否必须为每个合并执行此操作?这就是为什么git粉丝如此热衷于rebasing,因为revert基本没用吗? (2认同)
  • “m”是什么东西?当我运行 `git cat-file -p SOMECOMMIT` 时,我没有看到任何“m 1”或“m 2”。我看到 3 行标记为:树、父项、父项。 (2认同)

Gre*_*con 43

说另一个人在foo之上创建了bar,但是你在此期间创建了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 像往常一样给出了很好的答案.使用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

<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因为它可以破坏工作.

  • 将 `lola` 添加到 git 命令的简单方法:`git config --global alias.lola "log --graph --decorate --pretty=oneline --abbrev-commit --all"` (3认同)
  • 这是一个混乱,混乱,振作起来的世界.萝拉除外.万分感谢这个奇妙的别名. (2认同)

shm*_*111 6

我遇到了这个问题,解决方案是查看提交图(使用gitk),并查看以下内容:

*   commit I want to cherry-pick (x)
|\  
| * branch I want to cherry-pick to (y)
* | 
|/  
* common parent (x)
Run Code Online (Sandbox Code Playgroud)

我现在知道我想做

git cherry-pick -m 2 mycommitsha
Run Code Online (Sandbox Code Playgroud)

这是因为-m 1将基于公共父级进行-m 2合并,而基于分支y进行合并,这就是我要选择的分支。