如何做移动/重命名文件的git diff?

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

我该怎么做呢?

您需要使用-M让git在差异时自动检测移动的文件。 提到的knittl只是使用git diff不适合我。

所以简单地说: git diff -M应该这样做。

这个开关的文档是:

 -M[<n>], --find-renames[=<n>] Detect renames. If n is specified, it is a threshold on the similarity index (ie 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. 

除了knittl写的东西 ,你总是可以使用:

 git diff HEAD:./oldfilename newfilename 

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

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

 git diff HEAD:path/to/oldfilename newfilename 

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

参见Matthieu Moy( moy )的 提交5404c11 , 提交9501d19 , 提交a9276a6 , 提交f07fc9e , 提交62df1e6 (2016年2月25日) 。
(由Junio C gitster合并- gitster -于5d2a30d ,2016年4月3日)

diff :默认激活diff.renames

重命名检测是一个非常方便的function,新用户不应该在文档中挖掘以从中受益。

对重新激活重新命名检测的潜在反对意见是它有时会失败,而且有时很慢。 但是在“ git status ”和“ git merge ”等几种情况下,重命名检测已经被默认激活,所以激活diff.renames并不会从根本上改变这种情况。 当重命名检测失败时,它现在在“ git diff ”和“ git status ”之间一致失败。

这个设置不会影响pipe道命令,因此写得很好的脚本不会受到影响。

这个function的新testing在这里 。

无论什么原因使用HEAD:./oldfilename (或绝对path)不适合我,但HEAD:oldfilename did(谢谢cmn):

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

HTH

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