如何撤消已经提交的合并以及之后已经完成的其他合并

时间:2014-09-02 16:39:12

标签: git git-branch git-merge

我有一个我需要撤消的分支(Branch5),它被合并到另一个分支(Branch2),但由于,Branch3Branch4Branch6也已合并到Branch2。如何取消合并到Branch5的{​​{1}}?

希望这是有道理的。 Branch2基本上我需要的所有内容减去Branch2,但Branch5已合并到Branch5一些合并/提交之前,并且已经被推送过了。基本上,我如何还原它,使Branch2Branch2之外的所有分支都包含Branch5内的所有内容?

因此,进行搜索会显示以下内容......

git revert -m 1 hash_of_merge_commit

如何获取合并的哈希值?此外,1之后的-m是什么意思?最后,这实际上会起作用吗?

2 个答案:

答案 0 :(得分:1)

如何获取感兴趣的合并提交的哈希值?

在不了解您的回购状态的情况下(特别是Branch5目前的位置),确定Branch5合并到Branch2的SHA将会很难。但是,运行

git log --oneline --merges Branch2

会将日志限制为可以从Branch2访问的合并提交,这应该允许您轻松识别(感谢提交消息)感兴趣的提交的哈希值。

1之后的-m是什么意思?

为了说明事情,请考虑以下图表:

Branch5合并到Branch2

之前
... -- o -- A [HEAD=Branch2]

   ... -- o -- B [Branch5]

Branch5合并到Branch2

之后
... -- o -- A -- C [HEAD=Branch2]
                /
   ... -- o -- B [Branch5]

稍晚些时候

... -- o -- A -- C -- o -- ... -- o -- o [HEAD=Branch2]
                /
   ... -- o -- B [Branch5]

恢复提交C意味着创建一个新提交(让我们称之为Z)撤消C之父和C之间发生的更改。因为C是一个合并提交,它有几个(这里是两个)父项,所以你需要告诉git revert哪些更改,从AC或{{} 1}}到B,您实际上想撤消。

这就是C选项的来源;它代表-m,您可以在--parent-number手册页中找到有关-m选项的更多详细信息。在一个分支到另一个分支的简单合并中,

  • 第一个父母是签出分支的负责人(合并前),
  • 第二个父母是被合并的分支的负责人,

此处,git-revertA的第一个父级,CB的第二个父级。您要撤消CA之间的更改;因此,你需要运行

C

这实际上会起作用吗?

该还原操作可能会引发冲突,您必须解决这些冲突,但它实际上应该根据需要撤消git revert -m 1 C Branch5的合并。

Branch2

答案 1 :(得分:0)

所以你的命令是正确的,你获得提交哈希的方式是使用git log。作为每个日志条目的一部分,提交的哈希也位于那里。只需输入哈希值,或者至少输入前几个字符,就可以了。