CVS合并算法

one*_*elf 2 cvs diff merge

合并两个分支时使用什么算法CVS(使用-j)?

  • CVS标记,分支或日期是否可识别?
  • 它只是做一个纯文本差异(例如,使用unix diff工具)?
  • 它使用2路还是3路差异?
  • 如果它使用3路差异,它使用的基本版本是什么?

谢谢

Ash*_*Ash 6

我记得前一段时间读过CVS合并实际上是使用diff3算法来执行合并.

这PDF文章的diff3的正式调查,通过Sanjeev卡纳,凯沙夫注:Kunal和本杰明·C·皮尔斯 从宾夕法尼亚任恕详细介绍了diff3的算法.

如果主要关注合并算法本身的属性,而不是它如何与CVS集成.

在回答你的问题时:

标签,日期意识

从CVS手册页:

-j tag [:date]合并来自tag指定的修订的更改,或者,当指定date并且tag是分支标记时,合并来自分支标记的版本,因为它存在于日期

2或3方式和文本/二进制感知

diff3默认为纯文本差异.它比较(差异)文件的3个版本.

从diff3手册页:

如果`diff3'认为它所比较的​​任何文件是二进制文件(非文本文件),它通常会报告错误,因为这种比较通常没用.与'diff'一样,您可以强制'diff3'将所有文件视为文本文件,并使用'-a'或'--text'选项逐行比较它们.

比较期间的基本版本

根据链接文章,基本版本是文件的两个当前版本(A和B)之间的最后一个通用版本(O).它首先使用2路差分算法来找到O和A,O和B之间最长的公共子序列.

然后(引自文章)它:

...取O与A或B不同的区域并合并重叠的区域,导致图1(c)所示的稳定(所有复制品相等)和不稳定(一个或两个复制品更改)的交替序列0.3最后,它检查在什么每个组块已改变并决定(通过插入4,5),所以这种变化什么变化可以被传播,如图1(d),尤其是圆形,所述第二块处于只改可以传播到B,但是第四个块在A和B中都有变化,所以没有任何东西可以传播.

  • @oneself,您可以使用代表特定版本的标记指定-j一次或两次,但您只是告诉CVS要向diff3提供哪些文件修订版.除此之外,我不知道分支会影响cvs中的diff3算法.所以我对你的问题的回答是,cvs中的diff3会对文件进行基于文本的比较,并且根据你提供给它的标签,它可能会或可能不会分支识别.如果错误(我只是一个用户),很高兴被cvs专家纠正. (2认同)