我使用git mv
移动了一个文件。现在我想在新文件上做一个diff来将它与旧文件(旧的,现在不存在的名称)进行比较。
我该怎么做?
答案 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 5404c11见commit 9501d19,commit a9276a6,commit f07fc9e,commit 62df1e6,Matthieu 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
”之间。此设置不会影响管道命令,因此编写良好 脚本不会受到影响。
答案 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足够聪明,可以比较正确的文件/内容(即重命名前的原始内容与重命名后的更改内容)