0

我听到了很多关于 DVCS 系统的好消息,尤其是关于集市的消息。除了分布式存储库的概念之外,我还看到了两个主要优点:合并自动化程度更高,重命名处理得当。

有人可以指点我一些解释改进工作原理的文字吗?bazaar 怎么知道我重命名了一个文件?如果我将两个文件重命名为同一提交的一部分怎么办?当我通过将文件的一半内容放入新文件中进行重构,重新缩进所有内容并在几乎每一行中丢失一些空格时会发生什么?

换句话说,我想听听在现实生活中使用集市(或其他 DVCS)的人的意见,或者了解它(他们)如何工作的人的意见。合并真的那么好?它是如何实现的?


相关问题,有一个有用的答案:

为什么在 Mercurial 中分支和合并比在 Subversion 中更容易?

4

5 回答 5

3

DVCS 通过跟踪合并的父版本来实现更好的合并。在 Subversion 中,当您将一个分支合并到另一个分支时,您会丢失有关合并来源的信息。在像 Bazaar 或 Git 这样的 DVCS 中,“合并的”修订版最终有两个父修订版。

DVCS 之间的重命名处理方式不同。例如,Git 根本不跟踪重命名,因为这对 Linus 来说并不重要。Mercurial 将它们记录为“将旧文件复制到新文件,删除旧文件”。根据Canonical 的创始人 Mark Shuttleworth 的说法,Darcs 和 Bazaar 是唯一能够正确处理文件重命名的 DVCS。

bazaar 怎么知道我重命名了一个文件?

重命名由用户指定,就像添加或删除文件一样。使用“ bzr rename <old> <new>”命令标记文件或目录以进行重命名。如果您已经在树中重命名了文件,则可以使用“ --after”选项。

如果我将两个文件重命名为同一提交的一部分怎么办?

bzr rename <old> <new>然后为每个文件键入一次“ ”。Bazaar 不会尝试猜测哪些文件已被重命名。

当我通过将文件的一半内容放入新文件中进行重构,重新缩进所有内容并在几乎每一行中丢失一些空格时会发生什么?

然后你bzr add在新文件上输入“”,因为你并没有真正重命名它。

于 2008-09-05T18:49:48.463 回答
2

Merge 在 DVCS 中本质上并不是更好,只是如果分支/合并无法正常工作(svn 可以说没有正确实现分支/合并),它们实际上很难使用,因为您不是进行结帐,而是每次从现有代码开始处理项目时都创建一个新分支。我认为一些专有的集中式 SCS 确实可以正确处理合并/分支。

它适用于所有这些的方式是将每个提交记录在直接无环图 (DAG) 中,由此,您可以使用不同的合并策略。在这里您可以找到更多信息:

http://revctrl.org/CategoryMergeAlgorithm

至少 hg、bzr 和 git 可以使用外部合并实用程序。

于 2008-09-16T11:33:12.850 回答
1

以下是关于 darcs ( http://darcs.net ) 如何处理补丁的讨论 - http://darcs.net/manual/node9.html

于 2008-09-16T11:48:33.280 回答
1

整洁的文章阅读

http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/

于 2008-10-22T05:22:55.923 回答
0

我不熟悉集市,但 git 不跟踪文件重命名。对于 git,这看起来像是删除和添加。但是,git 足够聪明,可以看到文件的内容已经存在于其存储库中,并将跟踪它们在系统中的位置。如果您将文件拆分或合并,它足够聪明地跟踪代码段(blob)并存储该信息。

于 2008-09-05T16:54:21.453 回答