Filter git diff by type of change

GitDiff

Git Problem Overview


Is there a way to limit git diff to changed files?

I'd like to see the differences between two commits, but exclude paths that don't exist in one or the other (additions/deletions). The following Perl one-liner illustrates most of what I want:

git diff master.. | perl -lnwe 'print unless /^(new|deleted) file/../^diff/ and not /^diff/'

But that leaves diff --git a/path b/path lines for the files that were new or deleted. Plus it'd be much nicer if I didn't have to parse (also fails if any hunk contains anything matching /^diff/, for example).

Another alternative I tried was:

git diff --name-status (args) | perl -lnwe 'print if s/^M\s+//' | xargs git diff (args) --

Its output is better, but it still feels hackish.

Git Solutions


Solution 1 - Git

You are looking for --diff-filter=M to show only files Modified between the two branches.

From man git-diff

> --diff-filter=[ACDMRTUXB*] > > Select only files that are > > + A Added > + C Copied > + D Deleted > + M Modified > + R Renamed > + T have their type (mode) changed > + U Unmerged > + X Unknown > + B have had their pairing Broken > + * All-or-none > > Any combination of the filter characters may 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.

Solution 2 - Git

As Git 2.10 (Q3 2016) will remind us, there is an easier way to "show everything except added/deleted files." (actually since Git 1.8.5, July 2013)

 git diff --diff-filter=ad master..

See commit 16726cf (14 Jul 2016) by Junio C Hamano (gitster).
(Merged by Junio C Hamano -- gitster -- in commit 2f8c654, 08 Aug 2016)

> ## diff: document diff-filter exclusion

> In v1.8.5 days, 7f2ea5f (diff: allow lowercase letter to specify what change class to exclude, 2013-07-17) taught the "--diff-filter" mechanism to take lowercase letters as exclusion, but we forgot to document it.

So the documentation on diff-options now (finally) includes:

> These upper-case letters can be downcased to exclude.
E.g. --diff-filter=ad excludes added and deleted paths.

Make sure to use Git 2.36 (Q2 2022).

Solution 3 - Git

You can use the --diff-filter flag to do precisely this. git diff --diff-filter=CMRTUXB master.. should show everything except added/deleted files.

Solution 4 - Git

To see all modified and new files you can use

git diff --name-only --diff-filter=ACMR PREV_VERSION master

PREV_VERSION is the hash of your first commit.

To get an export as zip you can use this code

git archive --output=export.zip HEAD $(git diff --name-only --diff-filter=ACMR PREV_VERSION HEAD)

Note: .gitignore is not in export.zip

Solution 5 - Git

I've used Notepad++ (Windows), and these regular expressions to filter out extension types and certain paths from a diff file.

^Index.*\.(dll|pdb|exe|txt|zip|log|ism|resx|tlog|htm|lib)$[\s\S.]*?^Index
^Index: Shared/.+$[\s\S.]*?^Index
^Index: Next/source/Utility/.+$[\s\S.]*?^Index

Only problem is, when it reaches the end. You have to 'ctrl+home' and go again until it finds nothing.

(Replace whats found with 'Index')

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionbeniziView Question on Stackoverflow
Solution 1 - GitzenView Answer on Stackoverflow
Solution 2 - GitVonCView Answer on Stackoverflow
Solution 3 - GitLily BallardView Answer on Stackoverflow
Solution 4 - GitiwgView Answer on Stackoverflow
Solution 5 - GitKrzysztof StankiewiczView Answer on Stackoverflow