git如何跟踪源代码在文件之间移动?

Thi*_*ilo 29 git version-control dvcs

显然,当您将函数从一个源代码文件移动到另一个源代码文件时,git修订日志(对于新文件)可以显示该代码片段最初来自何处(请参阅本教程中的"查看历史记录"部分).

这是如何运作的?

Jör*_*tag 44

它不跟踪它们.这就是它的美丽.

Git只记录整个项目树的快照:这是所有文件在提交之前的样子,以及它们之后的样子.我们如何从这里到那里,Git并不关心.

这允许提交已经发生之后写入智能工具,以从该提交中提取信息.例如,通过将所有已删除文件与所有新文件进行比较并比较成对相似度量,完成Git中的重命名检测.如果相似性度量大于x,则认为它们被重命名,如果它在yx(y < x)之间,则认为是重命名+编辑,如果它在下面y,则认为它们是独立的.很酷的是,作为"提交考古学家",你可以在事后指明什么xy应该是什么.如果提交只记录"此文件是该文件的重命名",则无效.

检测移动的内容的工作方式类似:您将每个文件切片,计算所有切片之间的相似性度量,然后可以推断出此处删除的切片以及此处添加的这个非常相似的切片实际上是移动的相同切片从这里到那里.

然而,正如tonfa在他的回答中提到的,这是非常昂贵的,所以通常不会这样做.但它可以做到,这就是重点.

BTW:这与Google Wave,EtherPad,Gobby,SubEthaEdit,ACE和Co.使用的运营转型模型完全相反.

  • 我不太明白*"这就是它的美丽"*.我的意思是,你的解释听起来像*"Git不存储文件实际发生的事情,以便你以后可以自己猜测!"*美丽在哪里? (26认同)
  • 在我看来,它的美妙之处在于认识到跟踪不应该是核心版本控制本身的一部分."外包"这一特性避免了例如SVN的许多复杂性和缺点.您获得了简单性和灵活性(SVN工具通常仅限于使用最初记录的跟踪信息,即使这可能不是代码库实际发生情况的良好表示). (3认同)
  • 美丽的是,git并不认为其当前的启发式算法是正确的 - 它只是保存数据并让您以后使用您想要的任何启发式方法来解释数据.这也意味着如果某些启发式算法的计算成本非常高,那么它可以在除了(可能非常繁忙!)共享仓库之外的某个地方完成. (2认同)