I have 2 branches (A and B with common ancestor X), with multiple commits on each branch. I'd like to know the list of files which have been changed in both branches
A1 - A2 - A3 - ... - A
/
X
\
B1 - B2 - B3 - ... - B
So to display only files which can be found in both of these lists:
git diff X..A --name-only
git diff X..B --name-only
CodePudding user response:
Besides the two methods listed in the comments, consider using git ls-tree -r on the three commits in question. The output from ls-tree is already sorted, so comm works well here. If a file exists in all three commits with the same hash ID (and mode if you want to capture mode changes), you want to discard it; otherwise you want to include it in your final summary.
No matter which method you chose, you will need to write at least a little bit of code: use git merge-base (with --all if you want robust checking for a single merge base) to find commit X, then generate the file lists with either git diff or git ls-tree -r and do the filtering.
CodePudding user response:
( git diff --name-only A...B; git diff --name-only B...A ) | sort | uniq -d
is what you're looking for: files changed since the merge base on each, sorted, with only the duplicates listed.
