为什么git回复抱怨失踪

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

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

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

我在这里做错了什么?


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

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

通常这将是父母头号,例如,如果你在master身上,并且让git merge unwanted ,然后决定恢复unwanted的合并。 第一个父母是你的预合并master分支,第二个父母是unwanted

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

git revert -m 1 HEAD

说另一个人在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.

查尔斯贝利像往常一样给出了很好的答案。 使用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要小心 - 因为它会破坏工作。


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

链接地址: http://www.djcxy.com/p/407.html

上一篇: Why does git revert complain about a missing

下一篇: Revert to a commit by a SHA hash in Git?