显然,当您将一个函数从一个源代码文件移动到另一个源代码文件时,git修订日志(对于新文件)可以显示该代码片段最初来自哪里(例如参见{{中的查看历史记录部分) 3}})。
这是如何运作的?
答案 0 :(得分:44)
它不会跟踪它们。这就是它的美丽。
Git只记录整个项目树的快照:这是所有文件在提交之前的样子,以及它们之后的样子。 我们从这里到那里的方式,Git并不关心。
这允许在提交已经发生之后编写智能工具,以从该提交中提取信息。例如,通过将所有已删除文件与所有新文件进行比较并比较成对相似度量,完成Git中的重命名检测。如果相似性指标大于x
,则会将其视为重命名,如果它位于y
和x
之间(y < x
),则会将其视为重命名+编辑,如果低于y
,则认为它们是独立的。很酷的是,作为“提交考古学家”,您可以在事后指明x
和y
应该是什么。如果提交只记录“此文件是该文件的重命名”,则无效。
检测移动的内容的工作方式类似:您将每个文件切片,计算所有切片之间的相似性度量,然后可以推断出此处删除的切片以及此处添加的这个非常相似的切片实际上是相同的切片那是从这里搬到那里的。
然而,正如tonfa在他的回答中提到的那样,非常昂贵,因此通常不会这样做。但可以完成,这就是重点。
BTW:这与Google Wave,EtherPad,Gobby,SubEthaEdit,ACE和Co使用的运营转型模型完全相反。答案 1 :(得分:3)
这纯粹是一种启发式方法。它比较文件之间的距离并尝试查找匹配的块。但是这种启发式方法只有在代码被复制或移动到新文件时才会实现(否则,检查每对文件的成本太高)。