我多次遇到这样的说法:如果将单个函数从一个文件移动到另一个文件,Git可以跟踪它。例如,这一项说,"Linus说,如果您将一个函数从一个文件移动到另一个文件,Git将告诉您该单个函数在整个移动过程中的历史。“
但我对Git的一些设计有一点了解,我不知道这是怎么可能的。所以我想知道..。这是正确的说法吗?如果是的话,这怎么可能?
我的理解是,Git将每个文件的内容存储为Blob,并且每个Blob具有一个全局唯一的标识,该标识来自其内容和大小的SHA散列。然后,Git将文件夹表示为树。任何文件名信息都属于树,而不是Blob,因此文件重命名显示为对树的更改,而不是对Blob的更改。
因此,如果我有一个名为" foo“的文件,其中包含20个函数,而一个名为" bar”的文件中有5个函数,然后我将其中一个函数从foo移到bar(分别为19和6 ),那么Git如何检测到我将该函数从一个文件移动到另一个文件?
据我理解,这将导致两个新的块存在(一个用于修改foo,另一个用于修改后的条形图)。我意识到可以计算一个差异来显示函数从一个文件移动到另一个文件。但是,我不认为函数的历史可能会与bar而不是foo相关联(反正不是自动的)。
如果Git要实际查看单个文件的内部,并计算每个函数的blob (这将是疯狂的/不可行的,因为您必须知道如何解析任何可能的语言),那么我可以看到这是如何可能的。
所以..。这句话对不对?如果它是正确的,那么在我的理解中缺少什么呢?
发布于 2017-11-09 02:39:00
从现在支持开始,使用--color-moved选项检测移动行。它适用于跨文件的移动。
显然,它适用于彩色终端输出。据我所知,没有选择以纯文本补丁格式表示移动,但这是有意义的。
对于默认行为,请尝试
git diff --color-moved该命令还接受当前的选项,即no、default、plain、zebra和dimmed_zebra (使用git help diff获取最新选项及其描述)。例如:
git diff --color-moved=zebra至于它是如何完成的,您可以从此电子邮件交换由该功能的作者获得一些理解。
https://stackoverflow.com/questions/4908336
复制相似问题