我有一个仓库,其中一些文件已经从.html重命名为.php,并在上次拉取以来进行了多次编辑。使用git diff
显示所有html
内容已被删除,而所有php
内容已添加。是否有一种巧妙的方式让git diff
检测到重命名(类似于git log --follow
所做的),或者直接比较不同提交之间的不同文件名(类似于Git:如何比较不同分支中的两个不同文件?的解决方案,但是用于提交)?
我有一个仓库,其中一些文件已经从.html重命名为.php,并在上次拉取以来进行了多次编辑。使用git diff
显示所有html
内容已被删除,而所有php
内容已添加。是否有一种巧妙的方式让git diff
检测到重命名(类似于git log --follow
所做的),或者直接比较不同提交之间的不同文件名(类似于Git:如何比较不同分支中的两个不同文件?的解决方案,但是用于提交)?
您可以始终比较两个不同提交中的2个文件:
git diff commit1:file1_path commit2:file2_path
如前所述,所需格式为:
$ 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
使用./
明确指定的相对路径是可以的,但更常见的隐式路径 tests/foo/bar.sh
是不能使用的。该版本有时会默默失败 - 我认为这基于其他参数中使用的格式,但我不确定。绝对路径也无法使用; ~/repo/proj/tests/foo/bar.sh
和 /home/username/repo/proj/tests/foo/bar.sh
会失败。据我所知,这永远不会默默失败。
git diff path1 foo:path2
不起作用,但 git diff foo:path2 path1
可以。 - philh
git mv
吗? - dave