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

时间:2011-08-04 15:32:29

标签: git

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

我有一个我几周前创建的分支,而且我们的主要代码现在差不多了。结果,如果我在当前的HEAD和旧分支的尖端之间做差异,我会得到几十个已更改的文件,但这主要只是噪音。

我真的想看到一个只显示两个分支中存在的文件的差异。我知道一种方法是在当前的HEAD上挑选其他分支的提交,但有没有办法只使用git diff

2 个答案:

答案 0 :(得分:26)

以下可能会做你想要的:

git diff --diff-filter=M commitA commitB

M的{​​{1}}选项仅表示包含两个提交之间似乎要修改的文件 - 仅存在于一个分支中的文件或另一个分支中的文件将使用--diff-filter进行选择(“已添加”)或A(“已删除”)。

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

D

...并且git diff documentation中有关于所有内容的更多信息。

答案 1 :(得分:0)

existing answer 不是仅显示两次提交中存在的文件中的修改,而是显示两次提交中所有修改过的文件的差异。

比如说,一个提交修改了两个文件,另一个修改了1000个。根据问题,diff应该包含两个文件或更少,但另一个解决方案显示diff中有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,然后通过将 -d 标志传递给 uniq 来选择两者共有的文件,git diff 只选择重复项,最后调用 { {1}} 通过 xargs 处理这些常见文件并将我们的差异保存到文件中。