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

标签 visual-studio git resharper

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

也就是说,如果类名和包含的文件名一起更改并在没有进一步更改的情况下提交。

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

最佳答案

请记住,在 Git 的历史中,文件重命名不会存储为“this was renamed from X to 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.cppHEAD 中的一个新文件。然后它查看上一个 修订版以查看是否存在类似的文件。在直接文件重命名的情况下,是的,具有相同内容的名为 x.cpp 的文件存在于先前的修订版中(并且不再存在于当前修订版中)。因此,新文件显示为从 x.cpp 重命名为 y.cpp

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

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

关于visual-studio - 在一次提交中更改类和文件名时的 Git 重命名检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6513349/

相关文章:

git - git 默认忽略哪些文件/目录?

node.js - 将 mocha 与 resharper 一起使用

c# - 自动生成变量 *name* 以匹配您提供的参数?

c# - 如何在 Visual Studio 中执行 Ctrl+K、Ctrl+F?

visual-studio - 组织 Visual Studio 解决方案的最佳实践

linux - 为什么 git 不读取添加的文件?

javascript - 为什么 Javascript 项目将构建的结果检查到 git 中?

c# - 为什么有人告诉我这种类型转换是多余的?

c++ - UTF-8 与 cpp 案例所需的解释

visual-studio - Visual Studio 互联网连接失败