当与Subversion开发者交谈时你一定会听到提及术语祖先,这个词是用来描述两个对象的关系:如果他们互相关联,一个对象就是另一个的祖先,或者相反。
举个例子,假设你提交版本100,包括对foo.c
的修改,则foo.c@99是foo.c@100的一个“祖先”,另一方面,假设你在版本101删除这个文件,而在102版本提交一个同名的文件,在这个情况下,foo.c@99
与foo.c@102
看起来是关联的(有同样的路径),但是事实上他们是完全不同的对象,它们并不共享同一个历史或者说“祖先”。
指出svn diff和svn merge区别的重要性在于,前一个命令忽略祖先,如果你询问svn diff来比较文件foo.c
的版本99和102,你会看到行为基础的区别,diff
命令只是盲目的比较两条路径,但是如果你使用svn merge是比较同样的两个对象,它会注意到他们是不关联的,而且首先尝试删除旧文件,然后添加新文件,输出会是一个删除紧接着一个增加:
D foo.c A foo.c
大多数合并包括比较包括祖先关联的两条树,因此svn merge这样运作,然而,你也许会希望merge
命令能够比较两个不相关的目录树,举个例子,你有两个目录树分别代表了供应方软件项目的不同版本(见“供方分支”一节),如果你使用svn merge进行比较,你会看到第一个目录树被删除,而第二个树添加上!在这个情况下,你仅仅是希望svn merge以路径为基础比较两棵树,而忽略文件和目录的不相关性,当为合并命令添加--ignore-ancestry
选项时,就会像svn diff一样工作。(相反,--notice-ancestry
会导致svn diff像merge
命令一样工作。)