Is there a way to use git diff
to get a diff between two commits, but only show the diff for the files that exist in both commits?
I have a branch I created
The existing answer, instead of showing modifications only in files that exist in both commits, it shows a diff of ALL modified files in both commits. Say, for example, one commit had 2 files modified and another has 1000, according to the question, the diff should contain <=2 files but the other solution shows 1002 files in the diff!
Working Solution
I couldn't find any existing git
command to do this hence I had to use a combination of existing commands.
First, let's define an alias files
that gives us the names/paths of all files in a given commit like so-
git config --global alias.files 'diff-tree --no-commit-id --name-only -r'
Now git files commit_1
gives us all files present in commit_1
and doing the same on commit_2
gives us all files present in commit_2
. Please see this answer of why/how this command works.
Now, some command line acrobatics-
sort <(git files commit_1) <(git files commit_2) | uniq -d | xargs -d '\n' -n1 git diff commit_1 commit_2 > my_changes.diff
We are passing the list of files present in both commits to sort
and then picking files common to both by passing -d
flag to uniq
which picks only duplicates and finally invoking git diff
on these common files via xargs
and saving our diff into a file
The following may do what you want:
git diff --diff-filter=M commitA commitB
The M
option to --diff-filter
says only to include files that appear to be modified between the two commits - ones that only exist in one branch or the other would be selected with A
("added") or D
("deleted").
You can see which files would be selected with these letter codes by doing:
git diff --name-status commitA commitB
... and there's more information about all of that in the git diff documentation.