Visual studio 在一次提交中更改类和文件名时检测Git重命名

Visual studio 在一次提交中更改类和文件名时检测Git重命名,visual-studio,git,resharper,Visual Studio,Git,Resharper,使用Git处理类重命名(例如使用Resharper)的最佳方法是什么 也就是说,如果类名和包含文件名一起更改并提交,而无需进一步更改 Git通过百分比改变启发式方法处理重命名的方式似乎有点碰运气。 对于大型类,它将被识别为重命名,但对于小型类,它将达到百分比阈值,从而被视为删除和添加。请记住,在Git的历史记录中,文件重命名不会存储为“这是从X重命名为Y”。相反,文件X存在于一个版本中,而在下一个版本中Y存在(而X不存在)。例如: Revision | Files ---------+-----

使用Git处理类重命名(例如使用Resharper)的最佳方法是什么

也就是说,如果类名和包含文件名一起更改并提交,而无需进一步更改

Git通过百分比改变启发式方法处理重命名的方式似乎有点碰运气。
对于大型类,它将被识别为重命名,但对于小型类,它将达到百分比阈值,从而被视为删除和添加。

请记住,在Git的历史记录中,文件重命名不会存储为“这是从X重命名为Y”。相反,文件X存在于一个版本中,而在下一个版本中Y存在(而X不存在)。例如:

Revision | Files ---------+---------------------------------- HEAD^ | a.cpp x.cpp z.cpp HEAD | a.cpp y.cpp z.cpp 修订|文件 ---------+---------------------------------- 头^ a.cpp x.cpp z.cpp 头| a.cpp y.cpp z.cpp 在上图中,每个修订是一行,每个修订包含三个文件。在两次修订之间,
x.cpp
被重命名为
y.cpp
。存储库存储的唯一信息是每个单独修订的内容

当Git(或另一个读取Git存储库的工具)查看上述历史记录时,它注意到
y.cpp
HEAD
中的一个新文件。然后查看以前的版本,以查看是否存在类似的文件。如果是直接文件重命名,则是,一个名为
x.cpp
的文件,其内容与上一版本中存在的内容相同(当前版本中不再存在)。因此,新文件显示为从
x.cpp
重命名为
y.cpp

在重命名和修改的情况下,Git将查看以前版本的文件,以查看是否有一个文件看起来与新文件(就其内容而言)很接近。这就是启发式的用武之地。如果大多数行是相同的,那么Git会将其显示为重命名,但是如果与未更改的行相比有足够多的更改行,那么Git只会说它看起来像一个新文件


为了回答您的问题,处理resharper类重命名的最佳方法就是简单地执行并提交新文件。Git将旧文件和新文件存储在其存储库中。重命名检测稍后会在您实际询问历史时处理。这就是为什么像这样的命令有像
--查找副本
--查找副本更难的选项

几年后,我想这仍然是一个怪癖,因为它是git工作方式的基础


我现在做的是重命名、提交,然后进行更改。重构工具有点烦人,但没有其他解决方案保留历史记录(
--查找副本
--更难查找副本
似乎不起作用)。

Git没有明确跟踪重命名。它是在飞行中被推断的,所以没有办法使Git对待一个重命名的东西,如果它不能检测到的话,那么你是说:“在重命名之前评论,它们在重命名后再次提交”Ian Ringrose:不,不,不。如果你这样做,你会有一个在项目状态不能正常建立的中间的提交。(因为事情可能处于半重命名状态)。进行更改,包括在必要时重命名,并提交工作代码。