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

Ste*_*oon 11 git diff commit

我有一个存储库,其中许多文件已从.html重命名为.php,并在我上一次拉动后的许多提交中进一步编辑.使用git diff来展示所有的html内容删除,所有的php内容加入.有没有一种巧妙的方法来git diff检测重命名(类似的事情git log --follow),或直接比较不同提交中的不同文件名(类似于Git中的解决方案:如何在不同的分支中区分两个不同的文件?,但是对于提交)?

Eug*_*rov 10

您始终可以比较2个不同提交中的2个文件:

git diff commit1:file1_path commit2:file2_path
Run Code Online (Sandbox Code Playgroud)


Jac*_*ski 6

如前所述,所需的格式是:

$ git diff commit1:file1_path commit2:file2_path
Run Code Online (Sandbox Code Playgroud)

但有一些问题:

XXX$ git diff file1_path commit2:file2_path
Run Code Online (Sandbox Code Playgroud)

HEAD即使 file1_path 位于;中,这也不起作用。如果要为一个文件指定提交,则必须为两个文件指定提交。这将尝试将“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
Run Code Online (Sandbox Code Playgroud)

如果您尝试HEAD^:(...)/bar.sh与进行比较HEAD:(...)/quux.sh,则唯一允许的路径bar.sh是:

  • proj/tests/foo/bar.sh
  • ./tests/foo/bar.sh

显式相对路径有效./,但更常见的路径tests/foo/bar.sh不起作用。该版本有时会默默地失败- 我认为这是基于其他参数中使用的格式,但我不确定。绝对路径也不起作用;并将失败。AFAICT 永远不会默默地失败。~/repo/proj/tests/foo/bar.sh/home/username/repo/proj/tests/foo/bar.sh

  • “如果你想为一个文件指定提交,则必须为两个文件指定它” 不完全 - 似乎 `git diff path1 foo:path2` 不起作用,但 `git diff foo:path2 path1` 可以。 (2认同)