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)
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因为它可以破坏工作.
我遇到了这个问题,解决方案是查看提交图(使用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进行合并,这就是我要选择的分支。