有没有办法使用git diff
来获取两次提交之间的差异,但只显示两次提交中存在的文件的差异?
我有一个我几周前创建的分支,而且我们的主要代码现在差不多了。结果,如果我在当前的HEAD和旧分支的尖端之间做差异,我会得到几十个已更改的文件,但这主要只是噪音。
我真的想看到一个只显示两个分支中存在的文件的差异。我知道一种方法是在当前的HEAD上挑选其他分支的提交,但有没有办法只使用git diff
?
答案 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
处理这些常见文件并将我们的差异保存到文件中。