我已经使用Git一段时间了,并且喜欢它允许的工作流程的功能和灵活性.对我来说,早期和经常提交的能力对我而言非常重要,并且非常适合我的工作方式.
Git的一个功能我已经听过多次提到但是还没有理解它的事实是它跟踪内容而不是文件历史记录,这应该使处理重命名和移动文件更好.
有人可以解释为什么会这样吗?与SVN相比,我没有注意到这方面有什么特别之处.我错过了什么?
Sch*_*ern 10
Git分别存储三个数据:
这样做的结果是,如果你在几个文件中有相同的数据,git只需要存储一次,因为结构(包含目录和文件)只需要指向一个内容对象.
同样,如果文件没有从版本更改为版本,git只需要存储该文件一次.多个历史记录对象指向相同的内容.
一些用户可见的好处是git blame非常擅长看到代码跨文件移动,特别是如果你告诉它看起来真的很难git blame -C.这也是为什么git如此紧凑和快速,结构非常简单,走路非常便宜并且不会重复.
其中一个缺点是git不存储文件副本和重命名,它只是猜测,有时它是错误的.
这篇博客文章提供了一个相当好的消化但仍然详细的讨论内容跟踪购买git.如果您想了解更多信息,可以在Git上观看Linus的Google Tech Talk或阅读成绩单.
Git从一个版本到下一个版本存储的唯一信息是每个版本的文件的状态(名称和内容).在修订版A中,此文件具有此内容,而在修订版B中,此文件具有该内容.Git不会关心如何将文件从A点到了B点,无论是编辑,或重命名,或解决冲突,或章鱼合并.
这种方法具有概念上简单的存储库格式的好处.这很重要,因为您的存储库是您的历史记录,并且应该以尽可能最简单的格式保留历史记录.
这样做的一个含义是,每当Git需要弄清楚修订版A和B之间发生的事情时(例如),它需要在您提出要求时计算出详细信息.即使是简单的差异,虽然有些工具可能只是简单地显示内部存储的差异,但Git会比较修订版A和B中的文件,并在请求时重新生成差异.对于重命名,Git注意到刚刚出现一个新文件,并在先前版本中查找类似文件以猜测文件是否已重命名.
作为Git的工具的改进随着时间的推移,更多的是如何形成的历史可报告,没有它具有时间已记录.例如,经常声称Git可以"跟踪从一个文件移动到另一个文件的各个代码位".这完全是由于执行历史报告的程序的聪明,而不是由于存储库本身存储的任何内容.