当一次提交中的类和文件名发生更改时,Git重命名检测

Ala*_*sen 7 git resharper visual-studio

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

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

看起来Git通过改变启发式百分比来处理重命名的方式有点受打击.对于大类,它将被识别为重命名,但对于小类,达到百分比阈值,以便将其视为删除和添加.

Gre*_*ill 9

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

Revision | Files
---------+----------------------------------
HEAD^    | a.cpp    x.cpp             z.cpp
HEAD     | a.cpp              y.cpp   z.cpp

在上图中,每个修订版都是一行,每行包含三个文件.在两次修订之间,x.cpp被重命名为y.cpp.存储库存储的唯一信息是每个单独修订的内容.

当Git(或其他读取Git存储库的工具)查看上述历史记录时,它会注意到这y.cpp是一个新文件HEAD.然后它查看先前的修订版以查看是否存在类似的文件.在直接文件重命名的情况下,则是,x.cpp在先前版本中存在具有相同内容的文件(并且在当前修订中不再存在).因此,新的文件显示为从命名x.cppy.cpp.

在重命名和修改的情况下,Git将查看先前修订版的文件,以查看一个文件是否看起来接近新文件(就其内容而言).这是启发式的用武之地.如果大部分线路都一样,Git会显示它是改名,但如果有比持平线足以改变线,Git会简单地说,它看起来像一个新的文件.

要回答您的问题,处理resharper类重命名的最佳方法是简单地执行它并提交新文件.Git将旧文件和新文件存储在其存储库中.在您实际询问历史记录时,稍后会处理重命名检测.这就是为什么命令git log有像--find-copies和等选项--find-copies-harder.