如何在移动/重命名的文件上执行git diff?

时间:2011-04-20 12:41:24

标签: git diff file-rename mv

我使用git mv移动了一个文件。现在我想在新文件上做一个diff来将它与旧文件(旧的,现在不存在的名称)进行比较。

我该怎么做?

6 个答案:

答案 0 :(得分:138)

你需要使用-M让git在传播时自动检测移动的文件。仅使用git diff作为knittl提到的对我来说不起作用。

如此简单: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.

答案 1 :(得分:73)

除了knittl wrote之外,你总是可以使用:

git diff HEAD:./oldfilename newfilename

其中HEAD:./oldfilename表示上次提交中的oldfilename(在HEAD中),相对于当前目录。

如果你没有足够新的git,你将不得不使用:

git diff HEAD:path/to/oldfilename newfilename

答案 2 :(得分:19)

使用git 2.9(2016年6月),您不必再添加-M了。 git diff默认使用-M

commit 5404c11commit 9501d19commit a9276a6commit f07fc9ecommit 62df1e6Matthieu Moy (moy)(2016年2月25日)。{
} (由Junio C Hamano -- gitster --合并于commit 5d2a30d,2016年4月3日)

  

diff:默认情况下激活diff.renames

     

重命名检测是一个非常方便的功能,新用户不应该   必须深入了解文档以从中受益。

     

激活重命名检测的潜在反对意见就是它   有时失败,有时很慢。但重命名检测是   默认情况下已在某些情况下激活,例如“git status”和“git merge”,因此激活diff.renames并未从根本上改变   情况。重命名检测失败时,它现在一直失败   在“git diff”和“git status”之间。

     

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

The new tests for this feature are here

答案 3 :(得分:1)

无论出于何种原因使用HEAD:./oldfilename(或绝对路径)对我不起作用,但HEAD:oldfilename做了(感谢cmn):

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

HTH

答案 4 :(得分:1)

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命令。

答案 5 :(得分:-4)

只需在没有任何参数的情况下运行git diff,或git diff -- newfilename。 git足够聪明,可以比较正确的文件/内容(即重命名前的原始内容与重命名后的更改内容)