我有两个分支,它们实际上包含相同的文件,但由于遗留原因而分开。称他们为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
提交应该可以完全满足我的要求,但这不起作用。
答案 0 :(得分:5)
如何在不引入A的全部历史的情况下将A标记为合并到B?
不能。当git
说A
合并到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
结合将创建一个“空”提交-正如您所观察到的,它什么也不做。