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


合并后,git状态显示:

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

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


当前回答

好吧,这里的其他人给我的答案很接近,但没用。这是我所做的。

正在执行此操作。。。

git reset --hard HEAD^
git status

…给了我以下状态。

# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.

然后,我不得不多次输入相同的git重置命令。每次我这样做时,信息都会改变一个,如下所示。

> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.

此时,我看到状态消息发生了变化,所以我尝试进行git拉动,这似乎奏效了:

> git pull
Updating 2df6af4..12bbd2f
Fast forward
 app/views/truncated |    9 ++++++---
 app/views/truncated |   13 +++++++++++++
 app/views/truncated |    2 +-
 3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master

长话短说,我的命令归结为:

git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull

其他回答

它可以通过多种方式实现。

1) 中止合并

如果您处于错误合并(错误地使用了错误的分支)之间,并且希望避免合并,以便最新返回分支,如下所示:

git merge --abort

2) 将HEAD重置为远程分支

如果您从远程开发分支工作,可以将HEAD重置为远程分支上的最后一次提交,如下所示:

git reset --hard origin/develop

3) 删除当前分支,然后再次从远程存储库签出

考虑到您正在本地repo中开发分支,该分支与远程/开发分支同步,您可以执行以下操作:

git checkout master 
##to delete one branch, you need to be on another branch, otherwise you will fall with the branch :) 

git branch -D develop
git checkout -b develop origin/develop

使用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版本,如果您尚未提交合并,并且存在合并冲突,您可以简单地执行以下操作:

git merge --abort

来自man git merge:

只有在合并导致冲突后才能运行[This]。gitmerge--abort将中止合并过程并尝试重建合并前的状态。

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

$ git checkout -f

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

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

git reset --merge ORIG_HEAD

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

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