我知道Team Foundation版本控制中的无基础合并是危险的。我想知道Git是否也是危险的。如果您不熟悉无基合并,here's an example。红色虚线是无基重定/合并。使用Git这样做安全吗?
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)。
git checkout --orphan
bxgwgixi2#
您可以使用git cherry-pick对任何分支应用任意提交。
git cherry-pick
bis0qfac3#
红色显示的是一个完全正常的git合并,如果你在相同文件的相同位置修改两个分支中的内容,除了一些"正常"的合并冲突外,你不会遇到任何困难。但如果你不需要实现合并,你确实可以选择cherrypick。但是git的好处是你可以尝试撤销(撤销合并真的很容易!)。所以没有太多困难,你可以尝试合并,看看会发生什么,回答你自己的问题;- ),如果不满意就撤销!!欢迎土耳其空军起飞-)
ahy6op9u4#
“Does it”已经被回答了,但是我在这里问“How do it”。这可能在其他地方有答案,但是要在git中执行一个无基础的合并,你可以按照这些命令。
main
stage
orphan-main
my-pr-branch
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
4条答案
按热度按时间yx2lnoni1#
嗯,是也不是。Team Foundation版本控制(TFVC)强制实施分支层次结构,并且它有一个规则,即只能从分支合并到其父级或子级。在您提供的图像中,您可以将B合并到C,这 * 不是 * 无基础的合并。将B合并到C将使用B3作为公共祖先,并生成一个很好的、易于处理的三向合并。
然而,TFVC * 不 * 允许您直接将A合并到C中。您需要将A合并到B中,然后将结果合并到C中。如果您想绕过此工作流,您将陷入无基础合并的困境。这将跳过公共祖先计算。结果是您正在执行一个没有公共祖先的三路合并-两个文件看起来都像是新添加的和 any它们之间的差异将被视为冲突。
这是一个巨大的痛苦。
Git不会强制执行任何分支层次,所以在你的例子中,你可以从C合并到A,而不会受到惩罚。在这个例子中,A3是共同的祖先,你会得到下面的图:
所以这个场景在Git中不是一个无基础合并,但是你仍然可以在Git中进行无基础合并。如果你试图合并两个没有共同祖先(没有合并基础)的分支,那么这将是一个无基础合并,并且它将具有在TFVC中进行无基础合并时发生的所有问题。
您可以尝试创建一个没有父分支的新分支(通过
git checkout --orphan
)。bxgwgixi2#
您可以使用
git cherry-pick
对任何分支应用任意提交。bis0qfac3#
红色显示的是一个完全正常的git合并,如果你在相同文件的相同位置修改两个分支中的内容,除了一些"正常"的合并冲突外,你不会遇到任何困难。
但如果你不需要实现合并,你确实可以选择cherrypick。
但是git的好处是你可以尝试撤销(撤销合并真的很容易!)。所以没有太多困难,你可以尝试合并,看看会发生什么,回答你自己的问题;- ),如果不满意就撤销!!
欢迎土耳其空军起飞-)
ahy6op9u4#
“Does it”已经被回答了,但是我在这里问“How do it”。这可能在其他地方有答案,但是要在git中执行一个无基础的合并,你可以按照这些命令。
main
放入stage
并忽略历史记录orphan-main
的临时分支my-pr-branch
的分支,其中包含我想要对stage
进行的更改