如何在不添加历史记录的情况下将Git分支标记为已合并(Git merge -s我们的--squash)

时间:2018-08-19 11:20:13

标签: git

我有两个分支,它们实际上包含相同的文件,但由于遗留原因而分开。称他们为A和B。

如果我运行git log --oneline A ^B,Git将输出114次提交,这是预期的。

然后我可以在分支B上运行git merge -s ours --allow-unrelated-histories A,这向Git指示A已经合并到B中,而没有对最终文件状态进行任何更改。除了B现在收到这114次提交作为其历史记录的一部分(git log)之外,此方法有效。

如何在不引入A的全部历史的情况下将A标记为合并到B?

我尝试了git merge --squash -s ours --allow-unrelated-histories A,然后尝试了git commit,但这没有任何效果。

从概念上讲,挤压-s ours提交应该可以完全满足我的要求,但这不起作用。

1 个答案:

答案 0 :(得分:5)

  

如何在不引入A的全部历史的情况下将A标记为合并到B?

不能。当gitA合并到B时,这意味着可以从A访问B的历史记录。

您可以使用git log --first-parent来避免遵循合并的历史记录(如果不忽略其他合并提交时所需的其他历史记录)。

您可以完全丢弃分支A。 (如果您不希望它显示为未合并的分支,并且您不想查看其历史记录,那么您想要它做什么?)

如果您确实想存档A的历史记录,但通常不希望看到它,则可以将其迁移到通常不会被看到的存档库中,也可以替换{{ 1}}和branch(因为如果只是存档,则没有理由继续推进tag引用),那么至少它不是“未合并的分支”。

我想有一些额外的背景知识……“壁球合并”在这里不起作用的原因是因为它根本不会产生合并。给定

A

正常合并会产生

... x -- x -- A <--(A)

... x -- x -- B <--(B)

和正常的南瓜合并会产生

   ... x -- x -- A <--(A)
                  \
... x -- x -- B -- M <--(B)

区别在于... x -- x -- A <--(A) ... x -- x -- B -- M <--(B) 不是合并。它具有与合并相同的内容(从技术上讲,是相同的M对象),但仅保留第一个父对象;因此事后,git不会“记住”它与TREE有任何关系。

在您告诉git保留A(-s B)中的内容的情况下,ours来自TREE。将其与B结合将创建一个“空”提交-正如您所观察到的,它什么也不做。