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]