Git允许无基础合并吗?

6psbrbz9  于 2023-01-24  发布在  Git
关注(0)|答案(4)|浏览(126)

我知道Team Foundation版本控制中的无基础合并是危险的。我想知道Git是否也是危险的。
如果您不熟悉无基合并,here's an example。红色虚线是无基重定/合并。
使用Git这样做安全吗?

yx2lnoni

yx2lnoni1#

嗯,是也不是。Team Foundation版本控制(TFVC)强制实施分支层次结构,并且它有一个规则,即只能从分支合并到其父级或子级。在您提供的图像中,您可以将B合并到C,这 * 不是 * 无基础的合并。将B合并到C将使用B3作为公共祖先,并生成一个很好的、易于处理的三向合并。
然而,TFVC * 不 * 允许您直接将A合并到C中。您需要将A合并到B中,然后将结果合并到C中。如果您想绕过此工作流,您将陷入无基础合并的困境。这将跳过公共祖先计算。结果是您正在执行一个没有公共祖先的三路合并-两个文件看起来都像是新添加的和 any它们之间的差异将被视为冲突。
这是一个巨大的痛苦。
Git不会强制执行任何分支层次,所以在你的例子中,你可以从C合并到A,而不会受到惩罚。在这个例子中,A3是共同的祖先,你会得到下面的图:

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

所以这个场景在Git中不是一个无基础合并,但是你仍然可以在Git中进行无基础合并。如果你试图合并两个没有共同祖先(没有合并基础)的分支,那么这将是一个无基础合并,并且它将具有在TFVC中进行无基础合并时发生的所有问题。
您可以尝试创建一个没有父分支的新分支(通过git checkout --orphan)。

bxgwgixi

bxgwgixi2#

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

bis0qfac

bis0qfac3#

红色显示的是一个完全正常的git合并,如果你在相同文件的相同位置修改两个分支中的内容,除了一些"正常"的合并冲突外,你不会遇到任何困难。
但如果你不需要实现合并,你确实可以选择cherrypick。
但是git的好处是你可以尝试撤销(撤销合并真的很容易!)。所以没有太多困难,你可以尝试合并,看看会发生什么,回答你自己的问题;- ),如果不满意就撤销!!
欢迎土耳其空军起飞-)

ahy6op9u

ahy6op9u4#

“Does it”已经被回答了,但是我在这里问“How do it”。这可能在其他地方有答案,但是要在git中执行一个无基础的合并,你可以按照这些命令。

  • 尝试将所有main放入stage并忽略历史记录
  • 仅在阶段中删除的文件应重新添加
  • 仅在阶段中所做的更改应恢复为与主文件匹配
    • 仅应删除阶段中添加的文件,但不删除 * -此解决方案不删除额外文件。This answer about reparenting可以解决此问题。
  • 创建名为orphan-main的临时分支
  • 创建一个名为my-pr-branch的分支,其中包含我想要对stage进行的更改
git checkout --orphan orphan-main main
git commit --allow-empty -m 'orphan initial commit'
git checkout -b my-pr-branch --no-track stage        # or w/o my-pr-branch: git checkout stage
git merge orphan-main --allow-unrelated-histories
git branch -D orphan-main                            # optional

相关问题