Git 是否允许无基础合并?

Does Git allow baseless merges?

我知道在 Team Foundation 版本控制中进行无根据的合并是危险的。我想知道 Git.

是否也很危险

如果您不熟悉无基础合并,here's an example。红色虚线是毫无根据的 rebase/merge.

用 Git 这样做安全吗?

您可以使用 git cherry-pick 将任意提交应用于任何分支。

好吧,是也不是。 Team Foundation 版本控制 (TFVC) 强制执行分支层次结构,并且它有一条规则,即您只能从分支合并到其父级或子级。在您提供的图像中,您可以将 B 合并到 C,即 而不是 无根据的合并。将 B 合并到 C 将使用 B3 作为共同祖先,并产生一个很好的、易于处理的三向合并。

但是,TFVC不允许直接将A合并到C中。你应该先将A合并到B中,然后再将结果合并到C中。如果你想去围绕这个工作流,你被困在做一个无基础的合并,它跳过了共同的祖先计算。结果是您在没有共同祖先的情况下进行三向合并 - 两个文件看起来都是新添加的,它们之间的 任何 差异都将被视为冲突。

这是一个巨大的痛苦。

Git 不会尝试强制执行任何分支层次结构,因此在您的插图中,您可以从 C 合并到 A 而不会受到惩罚。在这种情况下,A3 将是共同的祖先,您将得到下图:

                C  1--2--3----M
                  /          /
        B  1--2--3--4--5    /
          /                /
A  1--2--3--4--5-----------

所以这种情况 不是 Git 中的无根据合并,但是你 可以 在 Git。如果您尝试合并两个具有 no 共同祖先(无合并基础)的分支,那么这将是一个无基础的合并,并且它会出现在您进行无基础合并时出现的所有问题TFVC.

您可以通过创建一个没有父级的新分支来尝试此操作(通过 git checkout --orphan)。

你用红色显示的是与 git 的完全正常的合并,你不会有困难,除了一些 'normal' 合并冲突,如果你在同一位置更改 2 个分支中的内容相同的文件。否则,没问题!

但如果您不需要具体化合并,您确实可以挑选。

但是 git 的优点是您可以尝试撤消(合并真的很容易撤消!)。所以没有太多困难,你可以尝试合并,看看会发生什么,回答你自己的问题;-) 如果你不满意就撤消!

欢迎离开 tfs ;-)