我有一个存储库,其中许多文件已从.html重命名为.php,并且自上次提取以来已在许多提交中进一步编辑。使用git diff
显示已移除的所有html
内容以及添加的所有php
内容。是否有一种简洁的方法让git diff
检测重命名(类似于git log --follow
),或者直接比较不同提交中的不同文件名(类似于Git: How to diff two different files in different branches?中的解决方案,但对于提交) ?
答案 0 :(得分:8)
您始终可以比较2个不同提交中的2个文件:
git diff commit1:file1_path commit2:file2_path
答案 1 :(得分:1)
如前所述,所需格式为:
$ git diff commit1:file1_path commit2:file2_path
但是有一些陷阱:
XXX$ git diff file1_path commit2:file2_path
即使file1_path位于HEAD
中,该操作也不起作用;如果要为一个文件指定提交,则必须为两个文件都指定提交。这将尝试将“ commit2:file2_path”解释为具有它进入的第一个目录的文件路径,例如HEAD^:foo/
。这种情况很少存在,因此通常会提供有用的错误消息。 (注意:@philh说git diff commit1:file1_path file2_path
可以正常工作,但是我还没有证实自己。)
file1_path
格式:给定的路径将被视为相对于存储库根目录的路径。绝对路径是不允许的,相对路径必须是明确的。举一个具体的例子;说您的目录结构如下所示,您的工作目录为~/repo/proj
:
~/repo
.git
proj
tests
foo
bar.sh
utils
baz
quux.sh
如果您尝试将HEAD^:(...)/bar.sh
与HEAD:(...)/quux.sh
进行比较,则bar.sh
唯一允许的路径是:
proj/tests/foo/bar.sh
./tests/foo/bar.sh
使用./
的 explicit 相对路径有效,但更常见的隐式路径tests/foo/bar.sh
将无效 。该版本有时会静默地失败-我认为这是基于其他参数中使用的格式,但我不确定。绝对路径也行不通; ~/repo/proj/tests/foo/bar.sh
和/home/username/repo/proj/tests/foo/bar.sh
将失败。永不失败的AFAICT。