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


合并后,git状态显示:

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

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


当前回答

如果分支被合并而未被推送,则下面给出的git reset命令将用于撤消合并:

git reset --merge ORIG_HEAD

例子:

git reset --merge origin/master

其他回答

只需创建新的分支,然后cherry pick所需的提交。

它的保护程序和更简单的重置在上面的许多答案中都有描述

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

正在执行此操作。。。

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

使用现代Git,您可以:

git merge --abort

旧语法:

git reset --merge

旧学校:

git reset --hard

但实际上,值得注意的是,如果存在merge_HEAD,gitmerge--abort仅等同于git-reset--merge。这可以在Git帮助的merge命令中阅读。

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

在失败的合并之后,如果没有merge_HEAD,则可以使用git-reset-mmerge来撤销失败的合并,但不一定使用gitmerge-art来撤销,因此它们不仅是同一事物的新旧语法。

我个人认为git reset-merge在日常工作中更加强大和有用,所以这是我一直使用的方法。

最简单的答案是奥迪尼奥-维尔蒙特给出的答案

首先执行git重置--合并ORIG_HEAD

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

git推原点HEAD—力

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

策略:在一切都很好的地方创建一个新的分支。

理由:恢复合并很难。有太多的解决方案,这取决于许多因素,例如您是否提交或推动了合并,或者自合并以来是否有新的提交。此外,您还需要对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