有人可以解释Git中使用的内容跟踪与其他SCM中使用的文件跟踪之间的区别

时间:2011-04-09 09:45:10

标签: svn git

我一直在使用Git一段时间,并且喜欢它允许的工作流程的功能和灵活性。对我来说,提前和经常提交的能力对我而言非常重要,并且非常符合我的工作方式。

Git的一个功能我听过很多次提到但是还没有理解它是因为它跟踪内容而不是文件历史记录,它可以更好地处理重命名和移动文件。

有人可以解释为什么会这样吗?与SVN相比,我没有注意到这方面有什么特别之处。我错过了什么?

2 个答案:

答案 0 :(得分:10)

Git商店three pieces of data separately

  • 内容存储在blob对象中
  • 历史记录存储在提交对象
  • 结构存储在树对象中

这样做的结果是,如果你在几个文件中有相同的数据,git只需要存储一次,因为结构(包含目录和文件)只需要指向一个内容对象。

同样,如果文件没有从版本更改为版本,git只需要存储该文件一次。多个历史记录对象指向相同的内容。

一些用户可见的好处是git blame is very good at seeing code move across files,特别是如果您使用git blame -C告诉它看起来很难。这也是为什么git如此紧凑和快速,结构非常简单,走路非常便宜并且不会重复的原因。

其中一个缺点是git不存储文件副本和重命名,它只是猜测,有时它是错误的。

This blog entry提供了一个相当好的消化但仍然详细的讨论内容跟踪购买git。如果您想了解更多信息,可以watch Linus' Google Tech Talk on Gitread the transcript

答案 1 :(得分:5)

Git从一个版本到下一个版本存储的唯一信息是每个版本的文件的状态(名称和内容)。在修订版A中,此文件具有此内容,而在修订版B中,此文件具有该内容。 Git不关心文件从A点到B点的如何,无论是编辑,还是重命名,冲突解决或章鱼合并。

这种方法具有概念上简单的存储库格式的好处。这很重要,因为您的存储库是您的历史记录,历史记录应该以最简单的格式保存。

这样做的一个含义是,每当Git需要弄清楚修订版A和B之间发生的事情时(例如),它需要在您提出要求时计算出详细信息。即使是简单的差异,虽然有些工具可能只是简单地显示内部存储的差异,但Git会比较修订版A和B中的文件,并在请求时重新生成差异。对于重命名,Git注意到刚出现的新文件,并在先前版本中查找类似文件以猜测文件是否已重命名。

随着Git工具随着时间的推移而改进,可以报告更多如何形成历史记录,而不必在当时记录。例如,经常声称Git可以“跟踪从一个文件移动到另一个文件的各个代码位”。这完全是由于执行历史报告的程序的聪明,而不是由于存储库本身存储的任何内容。