我不小心在本地主分支上运行了gitmergesome_other_branch。我还没有将更改推送给origin master。如何撤消合并?


合并后,git状态显示:

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

我如何撤销所有这些提交?


当前回答

如果没有冲突和合并完成,则:

  git reset --hard HEAD~1

如果在执行合并时发生冲突,则中止将使您退出最近的合并更改:

git merge --abort

或者如果您想恢复到特定的提交id。

 git reset --hard <commit-id>

其他回答

如果您想要一个命令行解决方案,我建议您只使用MBO的答案。

如果您是新手,您可能会喜欢图形化方法:

启动gitk(从命令行,或在文件浏览器中单击鼠标右键(如果有))您可以很容易地在那里发现合并提交-从顶部开始的第一个节点有两个父节点按照第一个/左侧父级的链接(合并前当前分支上的父级,通常为红色)在所选提交上,右键单击“将分支重置到此处”,选择此处的硬重置

作为一个额外的选项,我主要遵循这里描述的分支模型:http://nvie.com/posts/a-successful-git-branching-model/因此,通常都会与--no ff(无快进)合并。

我刚刚阅读了这个页面,因为我无意中将一个测试分支而不是我的发布分支与用于部署的master(网站,master是实时的)合并。测试分支有另外两个分支合并到它,总共有大约六个提交。

所以为了恢复整个提交,我只需要一个git重置--hardHEAD^,它就恢复了整个合并。由于合并没有快速进行,所以合并是一个块,后退一步就是“分支未合并”。

假设您的本地主机不领先于源/主机,您应该能够

git reset --hard origin/<branch-name>

因此,假设您在master上执行了此操作,那么您的本地master分支看起来应该与origin/master相同。

如果您注意到需要在合并后立即恢复,并且在合并尝试后还没有做任何其他操作,则只需发出以下命令:git reset--hard HEAD@{1}。

本质上,如果在合并之后没有提交任何其他内容,那么合并sha将指向HEAD@{0},因此HEAD@{1}将是合并之前的前一点。

如果你还没有提交,你只能使用

$ git checkout -f

它将撤消合并(以及您所做的一切)。