'git diff': 仅显示存在于两个提交版本中的文件差异

28

有没有办法使用git diff获取两个提交之间的差异,但仅显示存在于两个提交中的文件的差异?

我创建了一个分支几周前,现在我们的主要代码与它相差很大。因此,如果我在当前HEAD和旧分支的末尾之间进行比较,我会得到数十个更改的文件,但这大部分都是噪音。

我真的想看到仅显示存在于两个分支中的文件的差异的差异。 我知道做到这一点的一种方法是将另一个分支的提交在当前HEAD的顶部挑选出来,但是否有一种方法只使用git diff就可以实现呢?


@manojlds 这是不正确的。提交并不是仓库内容的快照。提交是对仓库内容更改的记录。在提交 B 中可能存在一个在提交 A 中不存在的新文件。 - andho
2个回答

39

以下代码可能符合您的需求:

git diff --diff-filter=M commitA commitB

M选项用于--diff-filter命令,表示只包括在两个提交之间似乎被修改的文件 - 只存在于一个分支或另一个分支中的文件将被选择为A("添加")或D("删除")。

您可以通过执行以下操作查看将使用这些字母代码选择哪些文件:

git diff --name-status commitA commitB

...而且所有这些方面的更多信息都可以在git diff文档中找到。


谢谢,这很有帮助...让我看到了我的思路错误在哪里。我真正想要的不是不同的文件(这仍然是很多文件),而是只针对旧分支中修改过的文件进行差异比较。 - Ryan Lundy
换句话说,我真的想看看如果我将旧分支作为补丁应用在新分支之上会产生什么变化。也许这就是我应该做的,因为撤销它很容易。 - Ryan Lundy
@Kyralessa:这是一个很好的问题(我希望我的回答也是 :)),所以我建议你创建一个新的问题来询问。 - Mark Longair
虽然我怀疑你想要的是 git diff old-branch...new-branch - 参见这个回答来解释在 git diff 上下文中的 ..... 语法。 - Mark Longair

0

现有答案显示的不仅是两个提交中存在的文件的修改,而是显示了所有被修改的文件的差异。

例如,一个提交中有两个文件被修改,另一个提交中有1000个文件被修改。根据问题,差异应该包含两个或更少的文件,但其他解决方案在差异中显示了1002个文件!


可行的解决方案

我找不到任何现有的git命令来完成这个任务,因此我必须使用一些现有命令的组合。

首先,让我们定义一个别名files,它可以给我们提供给定提交中所有文件的名称/路径,如下所示 -

git config --global alias.files 'diff-tree --no-commit-id --name-only -r'

现在,git files commit_1 命令会返回所有在 commit_1 中存在的文件,而在 commit_2 中执行相同的命令则会返回所有在 commit_2 中存在的文件。请参考 this answer 了解此命令的原理和用法。

现在,让我们进行一些命令行杂技 -

sort <(git files commit_1)  <(git files commit_2) | uniq -d | xargs -d '\n' -n1 git diff commit_1 commit_2 > my_changes.diff

我们将两个提交中存在的文件列表传递给 sort,然后通过向 uniq 传递 -d 标志来选择两者共同的文件,uniq 只会选择重复的文件,最后通过 xargs 在这些共同的文件上调用 git diff 并将差异保存到文件中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接