有好几次,我遇到这样的说法: 如果将一个函数从一个文件移动到另一个文件,Git 可以跟踪它。例如,这个条目说,“ Linus 说如果你将一个函数从一个文件移动到另一个文件,Git 会告诉你整个移动过程中这个函数的历史。”
但是我对 Git 的一些内部设计有一些了解,我不认为这是可能的。所以我在想... 这个说法正确吗?如果是这样,这怎么可能呢?
我的理解是,Git 将每个文件的内容存储为一个 Blob,并且每个 Blob 都有一个全局唯一的标识,这个标识来自其内容和大小的 SHA 散列。然后 Git 将文件夹表示为树。任何文件名信息都属于 Tree,而不属于 Blob,因此,例如,文件重命名显示为对 Tree 的更改,而不是对 Blob 的更改。
因此,如果我有一个名为“ foo”的文件,其中包含20个函数,还有一个名为“ bar”的文件,其中包含5个函数,并且我将其中一个函数从 foo 移动到 bar (结果分别是19和6) ,那么 Git 如何检测我将该函数从一个文件移动到另一个文件呢?
根据我的理解,这将导致2个新的 blobs 存在(一个用于修改的 foo,一个用于修改的 bar)。我意识到可以通过计算 diff 来表示函数从一个文件移动到了另一个文件。但是我不明白这个函数的历史怎么可能与 bar 而不是 foo 联系起来(至少不会自动联系起来)。
如果 Git 实际上查看单个文件的 在里面,并计算 每个函数的 blob 每个函数的 blob(这将是疯狂/不可行的,因为您必须知道如何解析任何可能的语言) ,那么我可以看到这可能是可能的。
那么... 这个陈述是否正确? 如果是正确的,那么我的理解还缺少什么?