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


合并后,git状态显示:

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

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


当前回答

最近,我一直在使用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重置--合并ORIG_HEAD

对于那些希望在推送更改后重置的用户,请执行以下操作(因为这是第一篇关于git重置合并问题的文章)

git推原点HEAD—力

这将以这样一种方式重置,即您不会在拉动后再次获得合并的更改。

在这种情况下,您需要使用git-reset--hard<branch_name>重置分支。如果要在重新设置之前保存更改,请确保创建一个新的分支并git checkout<branch_name>。

您也可以使用git-reset--hard<commit_id>将状态重置为特定的提交。

如果已推送更改,则可以改用git-restore<branch_name>。请务必了解如何在其他场景中使用git还原和git签出。

使用git reflog检查合并之前的提交(git refog将是比git log更好的选项)。然后,您可以使用以下方法重置它:

git reset --hard commit_sha

还有另一种方法:

git reset --hard HEAD~1

它会让你回到我的承诺。

请注意,任何已修改和未提交/未提交的文件都将重置为其未修改的状态。要保留它们,要么隐藏更改,要么查看下面的--merge选项。


正如@Velmont在下面的回答中所建议的,在这个直接案例中,使用:

git reset --hard ORIG_HEAD

可能会产生更好的结果,因为它应该保留您的更改。ORIG_HEAD将在合并发生之前直接指向提交,因此您不必自己寻找它。


另一个技巧是使用--merge开关而不是--hard,因为它不会不必要地重置文件:

git reset --merge ORIG_HEAD

--合并重置索引并更新<commit>和HEAD之间不同的工作树中的文件,但保留索引和工作树之间不同的文件(即具有尚未添加的更改)。

如果您正在合并过程中,您可以随时中止它

git merge --abort

奇怪的是,缺少了最简单的命令。大多数答案都是有效的,但撤销你刚才做的合并,这是一种简单而安全的方法:

git reset --merge ORIG_HEAD

引用ORIG_HEAD将指向合并之前的原始提交。

(--merge选项与合并无关。它就像git-reset--hard ORIG_HEAD,但更安全,因为它不会触及未提交的更改。)