Reputation: 6889
This question calls for "line numbers". If you do not care about line numbers in the output, see this question and answer.
Basically, I don't want to see the changed content, just the file names and line numbers.
Upvotes: 350
Views: 195723
Reputation: 15239
You can use this command to see the changed file names, but not with line numbers:
git diff --name-only
Go forth and diff!
Upvotes: 1003
Reputation: 2146
It's not pretty but here's one line of bash:
git diff --unified=0 HEAD~1..HEAD | grep -Po '(^diff --git [a-zA-Z/._]*|^@@.*@@)' | while read l; do if [[ -n ${l##@@*} ]]; then f=${l#*/}; else echo "$f:${l##@@ }" | cut -d' ' -f1 | tr -d '-'; fi; done
Explanation:
git diff --unified=0 HEAD~1..HEAD
Retrieves the commit info from Git
grep -Po '(^diff --git [a-zA-Z/._]*|^@@.*@@)'
Builds on a prior answer and filters down to lines containing filenames and line numbers
while read line; do
if [[ -n ${line##@@*} ]]; then
# Grabs filename from this pattern: "diff --git a/....."
filename=${line#*/};
else
# Grabs line number from this patterns: "@@ -<line> +<line> @@"
echo"$filename:${line##@@ }" | cut -d' ' -f1 | tr -d '-';
fi;
done
String parsing that converts into expected output:
file/name1.txt:34
file/name2.txt:98
file/name2.txt:101
file/name3.txt:2
Upvotes: 0
Reputation: 487735
Note: if you're just looking for the names of changed files (without the line numbers for lines that were changed), see another answer here.
There's no built-in option for this (and I don't think it's all that useful either), but it is possible to do this in Git, with the help of an "external diff" script.
Here's a pretty crappy one; it will be up to you to fix up the output the way you would like it.
#! /bin/sh
#
# run this with:
# GIT_EXTERNAL_DIFF=<name of script> git diff ...
#
case $# in
1) "unmerged file $@, can't show you line numbers"; exit 1;;
7) ;;
*) echo "I don't know what to do, help!"; exit 1;;
esac
path=$1
old_file=$2
old_hex=$3
old_mode=$4
new_file=$5
new_hex=$6
new_mode=$7
printf '%s: ' $path
diff $old_file $new_file | grep -v '^[<>-]'
For details on "external diff", see the description of GIT_EXTERNAL_DIFF
on the Git manual page (around line 700, pretty close to the end).
Upvotes: 72
Reputation: 91
On Windows, this filters the Git output to the files and changed line numbers:
(git diff -p --stat) | findstr "@@ --git"
diff --git a/dir1/dir2/file.cpp b/dir1/dir2/file.cpp
@@ -47,6 +47,7 @@ <some function name>
@@ -97,7 +98,7 @@ <another functon name>
To extract the files and the changed lines from that is a bit more work:
for /f "tokens=3,4* delims=-+ " %f in ('^(git diff -p --stat .^) ^| findstr ^"@@ --git^"') do @echo %f
a/dir1/dir2/file.cpp
47,7
98,7
Upvotes: 2
Reputation: 1039
The cleanest output, i.e. file names/paths only, comes with
git diff-tree --no-commit-id --name-only -r
Upvotes: 1
Reputation: 567
Use:
git diff master --compact-summary
The output is:
src/app/components/common/sidebar/toolbar/toolbar.component.html | 2 +-
src/app/components/common/sidebar/toolbar/toolbar.component.scss | 2 --
This is exactly what you need. The same format as when you are making a commit or pulling new commits from the remote.
PS: It's weird that nobody answered this way.
Upvotes: 54
Reputation: 5263
I use grep
as a naive solution.
$ git diff | grep -A2 -- '---'
An output example:
--- a/fileA.txt
+++ b/fileA.txt
@@ -0,0 +1,132 @@
--
--- a/B/fileC.txt
+++ b/B/fileC.txt
@@ -33663,3 +33663,68800 @@ word_38077.png,Latin
--
--- a/D/fileE.txt
+++ b/D/fileE.txt
@@ -17998,3 +17998,84465 @@ word_23979.png,Latin
--
--- a/F
+++ b/F
@@ -1 +1 @@
Maybe you can see the colored output. It helps you to read the output easily.
Upvotes: 0
Reputation: 1
Try to use:
git dif | grep -B <number of before lines to show> <regex>
In my case, I tried to search for where I had put a debug statement in the many files. I needed to see which file already got this debug statement like this:
git diff | grep -B 5 dd\(
Upvotes: 0
Reputation: 831
1) My favorite:
git diff --name-status
Prepends file status, e.g.:
A new_file.txt
M modified_file.txt
D deleted_file.txt
2) If you want statistics, then:
git diff --stat
will show something like:
new_file.txt | 50 +
modified_file.txt | 100 +-
deleted_file | 40 -
3) Finally, if you really want only the filenames:
git diff --name-only
Will simply show:
new_file.txt
modified_file.txt
deleted_file
Upvotes: 26
Reputation: 1
On git version 2.17.1
, there isn't a built-in flag to achieve this purpose.
Here's an example command to filter out the filename and line numbers from an unified diff:
git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'
For example, the unified diff:
$ git diff --unified=0
diff --cc foobar
index b436f31,df63c58..0000000
--- a/foobar
+++ b/foobar
@@@ -1,2 -1,2 +1,6 @@@ Line abov
++<<<<<<< HEAD
+bar
++=======
+ foo
++>>>>>>> Commit message
Will result in:
❯ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'
foobar:1
To match the output of commands in common grep match results:
$ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? )| @@@.*' | sed -e '0~3{s/ @@@[ ]\?//}' | sed '2~3 s/$/\n1/g' | sed "N;N;N;s/\n/:/g"
foobar:1:1:Line abov
grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? )
: Match filename from diff --cc <filename>
OR Match line number from @@@ <from-file-range> <from-file-range> <to-file-range>
OR Match remaining text after @@@
.sed -e '0~3{s/ @@@[ ]\?//}'
: Remove @@@[ ]\?
from every 3rd line to get the optional 1 line context before ++<<<<<<< HEAD
.sed '2~3 s/$/\n1/g'
: Add \n1
every 3 lines between the 2nd and 3rd line for the column number.sed "N;N;N;s/\n/:/g"
: Join every 3 lines with a :
.Upvotes: 0
Reputation: 2778
Shows the file names and amount/nubmer of lines that changed in each file between now and the specified commit:
git diff --stat <commit-hash>
Upvotes: 5
Reputation: 318468
Line numbers as in number of changed lines or the actual line numbers containing the changes? If you want the number of changed lines, use git diff --stat
. This gives you a display like this:
[me@somehost:~/newsite:master]> git diff --stat
whatever/views/gallery.py | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)
There is no option to get the line numbers of the changes themselves.
Upvotes: 94