Answers:
默认情况下,git revert
拒绝还原合并提交,因为这实际上是含糊的。我认为您HEAD
实际上是一个合并提交。
如果要还原合并提交,则必须指定要将合并的哪个父级视为主要干线,即要还原到的父级。
通常,这将是第一个父级,例如,如果您曾经参加过,master
并且做了git merge unwanted
,然后决定还原的合并unwanted
。第一个父级是您的合并前master
分支,第二个父级是的提示unwanted
。
在这种情况下,您可以执行以下操作:
git revert -m 1 HEAD
git cat-file -p [MERGE_COMMIT_ID]
将按顺序显示父分支。列出的第一个-m 1
是第二个-m 2
。
git revert [HASH] -m 2
告诉我在分支1.x-1.x上没有任何要提交的内容,工作目录很干净,但我的提交未还原。
假设另一个人在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 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"
我遇到了这个问题,解决方案是查看提交图(使用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进行合并,这就是我要选择的分支。
git-revert
,这是此问题的原因。
-m
选项的,而不是唯一的git merge
。也就是说,使用该-m
选项的原因似乎与还原和小插曲相似。如果那不是真的,请告诉我们。由于我还没有找到其他任何专门解决该问题的方法,感谢您的回答,这可能导致google帮助我找到了这个问题和有用的,相关的讨论!