我不小心在本地主分支上运行了gitmergesome_other_branch。我还没有将更改推送给origin master。如何撤消合并?
合并后,git状态显示:
# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.
我如何撤销所有这些提交?
我不小心在本地主分支上运行了gitmergesome_other_branch。我还没有将更改推送给origin master。如何撤消合并?
合并后,git状态显示:
# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.
我如何撤销所有这些提交?
当前回答
策略:在一切都很好的地方创建一个新的分支。
理由:恢复合并很难。有太多的解决方案,这取决于许多因素,例如您是否提交或推动了合并,或者自合并以来是否有新的提交。此外,您还需要对git有相对深入的了解,以使这些解决方案适应您的情况。如果你盲目地遵循一些指令,你可能会得到一个“空合并”,没有任何东西会被合并,进一步的合并尝试会让Git告诉你“已经是最新的”。
解决方案:
假设您想将dev合并到feature-1中。
查找要接收合并的修订:git log--单行功能-1a1b2c3d4将分支“dev”合并到“feature-1”<--要撤消的合并e5f6g7h8修复零点模块中的NPE<--合并前的NPE,您可能需要这个查看(及时返回):数字结账e5f6g7h8从那里创建一个新分支并签出:git签出-b功能-1
现在您可以重新启动合并:
合并:gitmerge-dev修复合并冲突。提交:gitcommit当您对结果满意时,删除旧分支:gitbranch--delete feature-1
其他回答
奇怪的是,缺少了最简单的命令。大多数答案都是有效的,但撤销你刚才做的合并,这是一种简单而安全的方法:
git reset --merge ORIG_HEAD
引用ORIG_HEAD将指向合并之前的原始提交。
(--merge选项与合并无关。它就像git-reset--hard ORIG_HEAD,但更安全,因为它不会触及未提交的更改。)
如果您想要一个命令行解决方案,我建议您只使用MBO的答案。
如果您是新手,您可能会喜欢图形化方法:
启动gitk(从命令行,或在文件浏览器中单击鼠标右键(如果有))您可以很容易地在那里发现合并提交-从顶部开始的第一个节点有两个父节点按照第一个/左侧父级的链接(合并前当前分支上的父级,通常为红色)在所选提交上,右键单击“将分支重置到此处”,选择此处的硬重置
最近,我一直在使用git reflog来帮助解决这个问题。只有在合并刚刚发生并且在您的机器上时,这才有效。
git-relog可能会返回如下内容:
fbb0c0f HEAD@{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 HEAD@{1}: checkout: moving from master to my-branch
e3753a7 HEAD@{2}: rebase finished: returning to refs/heads/master
e3753a7 HEAD@{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 HEAD@{4}: reset: moving to HEAD^
8400a0f HEAD@{5}: rebase: aborting
第一行表示发生了合并。第二行是我合并前的时间。我只需git reset-hard 43b6032来强制该分支在合并之前跟踪,然后继续。
您可以使用git reflog查找上一次结账。有时候,这是一个你想回到的好状态。
具体而言,
$ git reflog
$ git reset --hard HEAD@{0}
您应该重置为上一次提交。这应该是有效的:
git reset --hard HEAD^
或者甚至HEAD^^还原该还原提交。如果您不确定应该后退多少步,您可以始终提供完整的SHA参考。
如果出现问题,并且主分支没有任何本地更改,则可以重置为原始/主分支。