git相似性指数75%是否意味着git认为我已经重命名了一个文件?

时间:2015-07-07 14:25:04

标签: git git-diff

我在Visual Studio中使用GitExtensions,当我去提交我的更改时,它说我添加了两个新文件并且有第三个文件(.resx文件),它似乎与另一个.resx文件进行比较说他们有相似性指数75%

文件不相关,但文件的很大一部分是所有.resx文件中的标准模板,因此我可以理解它们被视为相似。

所以问题是 - 这个消息是否意味着git认为我已经重命名了旧文件,如果我按原样继续提交,它会搞砸吗?

2 个答案:

答案 0 :(得分:4)

Git不存储差异。 1 相反,每个提交都存储完整的文件(如索引时所提交的那样),作为一种独立的实体。要检索先前的提交,git只需找到提交ID并提取相关文件。 2

“相似性索引”以及“文件被重命名”或“文件被复制”的任何呈现都只是git 猜测发生的事情,试图让事情更加清晰例如,或提供从一个提交到另一个提交的最短路径。你是正确的,模板匹配在这一点上是误导git,但“这一点”是“向用户介绍如何从A点到达B点”,而不是“存在或将要存储的内容”。

git status命令 - 大概是我从未使用过的Visual Studio,只为你运行git status - 让git产生一个新的比较,这次是“最近/当前提交”({ {1}})vs“当前索引”,即“如果你现在提交将会提交什么”。实际上,您实际上得到了两个比较:HEAD - vs-index和index-vs-work-tree。这可以让你最好地猜测发生了什么 - 包括计算相似性索引,以便猜测某些文件是否被重命名。

请注意,一旦您对HEAD提交了任意两个提交,您就可以指定不同的复制和/或重命名阈值,以便以不同的方式显示“发生的事情”。 Git按需提取,通过提取(主要是内存中)两个提交,比较它们,再次计算每个相似性索引(再次),并从中复制或重命名。

1 这掩盖了git的“pack”文件,使用deltas。但是,pack文件通常在提交(或一系列提交)之后构建很长时间。新提交总是创建新的独立目标文件,以后可以以各种方式打包和重新打包。

2 为了加快操作,git 使用当前索引(缓存)信息来找出从“提交当前签出”的快速方法(如由索引/缓存标记为“要检出的新提交”(作为git diff的参数给出)。特别是,只要您没有修改工作树以使索引是最新的,这允许git checkout在类似的分支或提交之间切换时避免接触甚至检查大多数文件。

你不必担心这些脚注中的任何一个:它们都是在幕后自动处理的。 (当你开始使用git checkout参数时,脚注2 可以发挥作用,就像人们在服务器上使用裸存储库的花哨自动部署脚本一样。但是,即使在那里,它通常只能工作,所有自动。)

答案 1 :(得分:0)

Git不会根据相似性指数计算diff。相反,它将存储文件的hash value

TL; DR:您可以按原样提交,而不必担心git认为您只是重命名了该文件。