DVCS(DRCS)如何工作?
我已经听到了很多有关DVCS系统的好消息,尤其是关于集市的消息。除了分布式存储库的概念外,我还看到了两个主要的优点:合并可以更好地实现自动化,并且重命名可以正确处理。
有人可以指出一些说明改进工作原理的文字吗?集市如何知道我已重命名文件?如果我将两个文件重命名为同一提交的一部分怎么办?当我通过将文件内容的一半放入新文件中进行重构,重新缩进所有内容并几乎在每一行中丢失一些空格时,会发生什么情况?
换句话说,我想听听在现实生活中使用集市(或者其他DVCS)的人,或者知道其工作原理的人(他们)的信息。合并真的好多了吗?以及它是如何实现的?
相关问题,有一个有用的答案:
为什么在Mercurial中分支和合并比在Subversion中更容易?
解决方案
回答
我不熟悉集市,但是git不能跟踪文件重命名。对于git来说,这看起来像是删除和添加。但是,git足够聪明,可以看到文件的内容已存在于其存储库中,并将跟踪它们在系统中的位置。如果我们拆分文件或者合并文件,那么它足够聪明,可以跟踪代码段(斑点)并存储该信息。
回答
DVCS通过跟踪合并的父修订版来实现更好的合并。在Subversion中,当我们将一个分支合并到另一个分支时,我们将丢失有关合并起源的信息。在像Bazaar或者Git这样的DVCS中,"合并的"修订版本以两个父修订版本结束。
在DVCS之间,重命名的处理方式有所不同。例如,Git根本不跟踪重命名,因为它对Linus并不重要。 Mercurial将它们记录为"将旧文件复制到新文件,删除旧文件"。根据Canonical的创始人Mark Shuttleworth所说,Darcs和Bazaar是唯一能够正确处理文件重命名的DVCS。
How does bazaar know that I renamed a file?
重命名由用户指定,就像添加或者删除文件一样。使用"bzr重命名<old> <new>
"命令标记文件或者目录以进行重命名。如果我们已经在树中重命名了文件,则可以使用"--after
"选项。
What if I rename two files as part of the same commit?
然后为每个文件键入一次"bzr重命名<old> <new>
"。 Bazaar不会尝试猜测哪些文件已被重命名。
What happens when I refactor by putting half of the file's contents into a new file, re-indenting everything and losing some whitespace in nearly every line?
然后,在新文件中键入"bzr add
",因为我们并没有真正重命名它。
回答
合并在DVCS中并不是本质上更好的方法,只是如果分支/合并无法正确工作(svn可能无法正确实现分支/合并),它们实际上将很难使用,因为我们不是进行检出,而是每次从现有代码开始处理项目时,都要创建一个新分支。我认为某些专有的集中式SCS确实可以正确处理合并/分支。
它对所有这些对象的工作方式是将每个提交记录在直接非循环图(DAG)中,由此我们可以使用不同的合并策略。在这里我们可以找到更多信息:
http://revctrl.org/CategoryMergeAlgorithm
至少hg,bzr和git可以使用外部合并实用程序。
回答
以下是darcs(http://darcs.net)如何处理补丁http://darcs.net/manual/node9.html的讨论。
回答
整洁的文章阅读
http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/