我多次遇到这样的说法:如果将单个函数从一个文件移动到另一个文件,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 (这将是疯狂的/不可行的,因为您必须知道如何解析任何可能的语言),那么我可以看到这是如何可能的。
所以..。这句话对不对?如果它是正确的,那么在我的理解中缺少什么呢?
发布于 2012-05-19 11:53:13
这个功能是通过git blame -C <file>提供的。
-C选项促使git尝试在文件中添加或删除文本块与在相同的更改集中修改文件之间找到匹配。附加的-C -C或-C -C -C扩展了搜索。
尝试使用git blame -C进行测试回购,您将看到您刚刚移动的代码块起源于它所属的原始文件。
来自git help blame手册页面:
行的起源自动跟随整个文件重命名(目前没有选项关闭重命名跟踪)。若要跟踪从一个文件移动到另一个文件的行,或跟随从另一个文件复制和粘贴的行等,请参阅
-C和-M选项。
发布于 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至于它是如何完成的,您可以从此电子邮件交换由该功能的作者获得一些理解。
发布于 2011-02-06 12:48:31
这个功能的一部分在git gui blame (+文件名)中。它显示了一个文件行的注释,每一行都指示何时创建和最后一次更改。对于跨文件的代码移动,它显示原始文件的提交作为一个创建,以及在最后一次更改时将其添加到当前文件的提交。试试看。
我真正想要的是将git log作为一个参数,在文件路径上附加一个行号范围,然后它将显示这个代码块的历史。如果文档是正确的,就没有这样的选择。是的,从Linus的声明中,我也认为这样的命令应该是现成的。
https://stackoverflow.com/questions/4908336
复制相似问题