【问题标题】:Git: How to diff two different files in different commits?Git:如何在不同的提交中区分两个不同的文件?
【发布时间】:2017-08-19 21:26:46
【问题描述】:

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

【问题讨论】:

  • 原来改文件的时候用git mv了吗?
  • git diff commit1:file1_path commit2:file2_path
  • 这可以解决问题,谢谢,请转换为答案,以便我接受。 (不幸的是,它在单个文件级别,但我现在可以做需要做的事情。)
  • @dave:实际上不确定 - 其他人移动了文件。
  • @dave:这实际上并不重要。 Git 通常通过进行树比较来检测 重命名(而不是记录它们)。但是,这需要您区分两个完整的树,而不是树中的两个特定文件。

标签: git diff commit


【解决方案1】:

您总是可以在 2 个不同的提交中比较 2 个文件:

git diff commit1:file1_path commit2:file2_path

【讨论】:

  • 仅包含代码的答案会被标记为“低质量帖子”,请尝试稍微解释一下您的答案以避免它被删除。
  • @ElpieKay 一年前提供了这个答案作为对我的问题的评论 - 在此处标记他以提供它作为答案。如果我在一周内没有得到他的回复,尤金,请在此联系我,我会接受你的答复。
  • @SteveKroon 自您发表评论以来,明天已经 3 周了。我感谢 ElpieKay 的输入,他确实添加了很好的评论,但看起来他不在。如果您愿意,请随时接受我的回答/
【解决方案2】:

如前所述,所需格式为:

$ 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.shbar.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 将失败。永远不会默默失败的 AFAICT。

【讨论】:

  • "如果你想为一个文件指定一个提交,你必须为两个文件都指定" 不完全-似乎git diff path1 foo:path2 不起作用,但git diff foo:path2 path1 起作用。
  • 呵呵,我以为我测试过了,但它失败了。
猜你喜欢
  • 2011-12-29
  • 2021-11-13
  • 2013-12-10
  • 2023-04-05
  • 2015-08-13
  • 2017-04-30
  • 2018-10-08
相关资源
最近更新 更多