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.
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.
You can use this command to see the changed file names, but not with line numbers:
git diff --name-only
Go forth and diff!
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.
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).
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.
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
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>
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
The cleanest output, i.e. file names/paths only, comes with
git diff-tree --no-commit-id --name-only -r
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 :
.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.
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\(
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