Git:如何在不同的提交中区分两个不同的文件?

时间:2017-03-27 08:52:07

标签: git diff commit

我有一个存储库,其中许多文件已从.html重命名为.php,并且自上次提取以来已在许多提交中进一步编辑。使用git diff显示已移除的所有html内容以及添加的所有php内容。是否有一种简洁的方法让git diff检测重命名(类似于git log --follow),或者直接比较不同提交中的不同文件名(类似于Git: How to diff two different files in different branches?中的解决方案,但对于提交) ?

2 个答案:

答案 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.shHEAD:(...)/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。