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