Git commands such as diff
, log
, whatchanged
all take a flag called
--diff-filter
. This can filter for only certain types of diffs, such
as added (A), modified (M), or deleted (D).
Man page
You can find the full description by searching for --diff-filter
in the man git diff
page.
--diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]
Select only files that are Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R), have their type (i.e. regular file, symlink, submodule, ...)
changed (T), are Unmerged (U), are Unknown (X), or have had their pairing Broken (B). Any combination of the filter characters (including none) can be used.
When * (All-or-none) is added to the combination, all paths are selected if there is any file that matches other criteria in the comparison; if there is no
file that matches other criteria, nothing is selected.
Also, these upper-case letters can be downcased to exclude. E.g. --diff-filter=ad excludes added and deleted paths.
Note that not all diffs can feature all types. For instance, diffs from the index to the working tree can never have Added entries (because the set of paths
included in the diff is limited by what is in the index). Similarly, copied and renamed entries cannot appear if detection for those types is disabled.
Try it out
Open up a git repo and play around with this, here are some example that I played with that seemed useful to me.
# find when any files were deleted
git log --diff-filter D
# find when all files were added
git log --diff-filter A
# only one specific file
git log --diff-filter A -- readme.md
# partial match to a single file
git log --diff-filter A -- read*
# Find when all python files were added
git log --diff-filter A -- *.py