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


合并后,git状态显示:

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

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


当前回答

您可以使用git reset命令。

git reset-将当前HEAD重置为指定状态。git重置[--混合|--soft|--hard|--merge][-q][]git-reset[-q][][-]…git重置--补丁[] [--] […]

GIT重置

其他回答

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

git reset --merge ORIG_HEAD

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

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

使用此命令中止合并:

git merge—中止

使用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 reset --hard origin/<branch-name>

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