Git 如何撤消已提交的合并,以及在此之后已完成的其他合并

Git 如何撤消已提交的合并,以及在此之后已完成的其他合并,git,git-branch,git-merge,Git,Git Branch,Git Merge,我有一个需要撤消的分支(Branch5),它被合并到另一个分支(Branch2)中,但从那时起,Branch3,Branch4,Branch6也被合并到了Branch2。我如何将合并到Branch2中的Branch5解合并 希望这是有道理的Branch2基本上拥有我所需要的一切减去Branch5,但是Branch5在几次合并/提交之前被合并到Branch2中,并且已经被推送。基本上,我如何还原它,使它在Branch2中拥有除Branch5之外的所有分支的所有内容 因此,进行搜索将显示以下内容 g

我有一个需要撤消的分支(
Branch5
),它被合并到另一个分支(
Branch2
)中,但从那时起,
Branch3
Branch4
Branch6
也被合并到了
Branch2
。我如何将合并到
Branch2
中的
Branch5
解合并

希望这是有道理的
Branch2
基本上拥有我所需要的一切减去
Branch5
,但是
Branch5
在几次合并/提交之前被合并到
Branch2
中,并且已经被推送。基本上,我如何还原它,使它在
Branch2
中拥有除
Branch5
之外的所有分支的所有内容

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

git revert-m1 hash\u of\u merge\u commit


如何获取合并的哈希值?另外,这里
-m
之后的
1
是什么意思?最后,这真的有效吗?

因此,您的命令是正确的,获取提交哈希值的方法是使用
git log
。作为每个日志条目的一部分,提交的哈希也位于其中。只需将其作为散列输入,或者至少输入前几个字符,就可以了。

如何获得感兴趣的合并提交的散列? 如果不了解更多有关回购协议状态的信息(特别是目前
Branch5
所在的位置),识别将
Branch5
合并到
Branch2
中的SHA将非常困难。然而,运行

git log --oneline --merges Branch2
将日志限制为合并可从
Branch2
访问的提交,这将允许您轻松识别(由于提交消息)感兴趣的提交的散列

-m
之后的
1
是什么意思? 为了说明事物,考虑下面的图表:

在将
Branch5
合并到
Branch2
Branch5
合并到
Branch2
晚些时候 恢复提交
C
意味着创建一个新的提交(我们称之为
Z
),撤消在
C
的一个父级和
C
本身之间发生的更改。因为
C
是一个合并提交,它有几个(这里有两个)父级,所以您需要告诉
git revert
哪些更改,从
a
C
,或者从
B
C
,您实际上想要撤消

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

  • 第一个父级是签出分支的头(合并之前)
  • 第二个父级是正在合并的分支的负责人
这里,
A
C
的第一个父级,
B
C
的第二个父级。要撤消
A
C
之间的更改;因此,你需要跑步

git revert -m 1 C
这真的有效吗? 该恢复操作可能会产生冲突,您必须解决这些冲突,但实际上,它应该根据需要撤消将
Branch5
合并到
Branch2

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

你的回购协议的ASCII图,即使是简化的,也会有所帮助。特别是,
Branch5
是否仍然存在,或者它是否已被删除?是的
Branch5
仍然存在,这是否意味着我可以以某种方式使用
git diff
?另外,自从您将
Branch5
合并到
Branch2
中以来,您是否在
Branch5
上提交了任何内容?事实上,我不确定。有可能…:(虽然,我不这么认为……我想我需要的是合并的哈希,而不是提交。如何获取合并哈希代码?git日志给我10天前的提交。我刚刚将一些东西合并到
Branch2
,并通过
git push origin Branch2
推送它,但它没有显示合并,为什么?在我删除
Branch5
之后,
Branch2
将是完美的,在它被合并到
master
之后就不再需要它了。那
git rev list
代码刚刚吐出了大量的散列代码,除了散列代码什么都没有了…@SolomonClosson对不起,我的意思是
git log--oneline--merges Branch2
。我会更新我的答案。非常感谢,这是一个很棒的例子tuff!我认为发生的事情是,该分支是在另一个分支内创建的,作为它的起点,这导致了一个问题,因为该分支需要在今天上线,而另一个分支需要更多的长期更新…无论如何,它现在已经修复,感谢您的帮助。
... -- o -- A -- C -- o -- ... -- o -- o [HEAD=Branch2]
                /
   ... -- o -- B [Branch5]
git revert -m 1 C
... -- o -- A -- C -- o -- ... -- o -- o -- Z [HEAD=Branch2]
                /
   ... -- o -- B [Branch5]