我在Joel on Software上阅读:
并在HgInit:
通过查看SVN的存储库文件夹,我的印象是Subversion将每个修订都保留为变更集。据我所知,Hg同时使用变更集和快照,而Git仅使用快照来存储数据。
如果我的假设是正确的,那么必须有其他方法可以使DVCS中的合并变得容易。那些是什么?
*更新:
...
回顾一下:DVCS的重点是拥有许多分散的存储库,并不断地来回合并更改。如果没有良好的合并,DVCS就毫无用处。但是,CVCS仍然可以在糟糕的合并中幸存下来,特别是在供应商可以限制其用户避免分支的情况下。 – Jörg W Mittag的answer
。
请注意,两个(或更多)提交中可能有一个以上的共同祖先。 Git使用所谓的“递归”合并策略,该策略合并合并基础(公共(public)祖先),直到您剩下一个虚拟/有效的公共(public)祖先(以某种简化方式),并且可以执行简单的三向合并。 – Jakub Narębski的answer
还要检查How and/or why is merging in Git better than in SVN?
最佳答案
在Git和其他DVCS中合并不是一件容易的事,这并不是因为Joel徘徊了一些神秘的系列变更集 View (除非您使用具有补丁理论的Darcs或某些Darcs启发的DVCS;它们是少数派),但是由于合并跟踪,并且更基本的事实是每个修订版都知道其父级。为此,您需要(我认为)整个树/完整存储库提交...不幸的是,这限制了执行部分 check out 以及仅对文件子集进行提交的能力。
当每个修订(每个提交)(包括合并提交)知道其父代(对于合并提交意味着拥有/记住多个父代,即合并跟踪)时,您可以重建修订历史记录的图表(DAG =直接非循环图)。如果您知道修订图,则可以找到要合并的提交的共同祖先。而且,当您的DVCS知道如何来查找共同祖先时,您就不需要提供它作为参数,例如在CVS中。
请注意,两个(或更多)提交中可能有一个以上的共同祖先。 Git使用所谓的“递归”合并策略,该策略合并合并基础(公共(public)祖先),直到您剩下一个虚拟/有效的公共(public)祖先(以某种简化方式),并且可以执行简单的三向合并。
Git使用重命名检测是为了能够处理涉及文件重命名的合并而创建的。 (这支持Jörg W Mittag的论点,即DVCS具有更好的合并支持,因为他们必须拥有DVt,因为合并比CVCS更为常见,合并隐藏在'update'命令中,在update-then-commit工作流中,参见Understanding Version Control(WIP) (埃里克·雷蒙德)。