有没有办法使用git diff
获取两个提交之间的差异,但仅显示存在于两个提交中的文件的差异?
我创建了一个分支几周前,现在我们的主要代码与它相差很大。因此,如果我在当前HEAD和旧分支的末尾之间进行比较,我会得到数十个更改的文件,但这大部分都是噪音。
我真的想看到仅显示存在于两个分支中的文件的差异的差异。 我知道做到这一点的一种方法是将另一个分支的提交在当前HEAD的顶部挑选出来,但是否有一种方法只使用git diff
就可以实现呢?
有没有办法使用git diff
获取两个提交之间的差异,但仅显示存在于两个提交中的文件的差异?
我创建了一个分支几周前,现在我们的主要代码与它相差很大。因此,如果我在当前HEAD和旧分支的末尾之间进行比较,我会得到数十个更改的文件,但这大部分都是噪音。
我真的想看到仅显示存在于两个分支中的文件的差异的差异。 我知道做到这一点的一种方法是将另一个分支的提交在当前HEAD的顶部挑选出来,但是否有一种方法只使用git diff
就可以实现呢?
以下代码可能符合您的需求:
git diff --diff-filter=M commitA commitB
M
选项用于--diff-filter
命令,表示只包括在两个提交之间似乎被修改的文件 - 只存在于一个分支或另一个分支中的文件将被选择为A
("添加")或D
("删除")。
您可以通过执行以下操作查看将使用这些字母代码选择哪些文件:
git diff --name-status commitA commitB
...而且所有这些方面的更多信息都可以在git diff
文档中找到。
现有答案显示的不仅是两个提交中存在的文件的修改,而是显示了所有被修改的文件的差异。
例如,一个提交中有两个文件被修改,另一个提交中有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
并将差异保存到文件中。