如何对移动/重命名的文件执行 git 差异?

我用 git mv移动了一个文件。现在,我想对新文件做一个差异,以便与旧文件(使用旧的,现在不存在的名称)进行比较。

我该怎么做?

35467 次浏览

只需运行 git diff而不需要任何参数,或者 git diff -- newfilename。Git 足够聪明,可以比较正确的文件/内容(即重命名前的原始内容和重命名后更改的内容)

除了 凯特尔写的,你还可以使用:

git diff HEAD:./oldfilename newfilename

其中,相对于工作目录,HEAD:./oldfilename在最后一次提交中表示 oldfilename (在 HEAD 中)。

如果你没有足够新的 git,你只能使用:

git diff HEAD:path/to/oldfilename newfilename

不管出于什么原因,使用 HEAD:./oldfilename(或绝对路径)对我不起作用,但 HEAD:oldfilename起作用了(谢谢 cmn) :

git diff HEAD:oldfilename newfilename
git diff 2a80f45:oldfilename f65f3b3:newfilename

高温

您需要使用-M 来让 git 在不同的时候自动检测移动的文件。只使用 git diff作为针织提到不适合我。

因此,简单地说: git diff -M应该做到这一点。

这个转换的文档如下:

-M[<n>], --find-renames[=<n>]
Detect renames. If n is specified, it is a threshold on the similarity index
(i.e. amount of addition/deletions compared to the file’s size). For example,
-M90% means git should consider a delete/add pair to be a rename if more than
90% of the file hasn’t changed.

使用 git 2.9(2016年6月) ,您不再需要添加 -M

提交5404c11提交9501d19提交9276A6犯罪提交62df1e6(2016年2月25日) by 马修 · 莫伊(moy)
(由 朱尼奥 · C · 哈马诺 gitster于2016年4月3日在 犯下第5d2a30d合并)

diff: 默认激活 diff.renames

重命名检测是一个非常方便的特性,新用户不应该这样做 必须深入研究文档才能从中受益。

对激活重命名检测的潜在反对意见是 有时失败,有时缓慢。但是重命名检测是 在一些情况下,如“ git status”和“ git merge”已经默认激活,所以激活 diff.renames不会从根本上改变 当重命名检测失败时,它会一直失败 在「 git diff」和「 git status」之间。

此设置不影响管道命令,因此编写良好 脚本不会受到影响。

这个特性的新测试在这里

正如其他人所说,git diff -M激活重命名检测(正如@VonC 所指出的,它在默认情况下是从 git 2.9激活的)。但是,如果您有一个大的变更集,不精确的重命名检测仍然可能会再次关闭。Git 会显示如下的警告,在你浏览的区别中很容易被忽略:

warning: inexact rename detection was skipped due to too many files.
warning: you may want to set your diff.renameLimit variable to at least 450 and retry the command.

在这种情况下,按 git 的建议设置配置选项,例如

git config diff.renamelimit 450

并重新运行 diff 命令。