Using git diff, how can I get added and modified lines numbers?
Solution 1
git diff --stat
will show you the output you get when committing stuff which is the one you are referring to I guess.
git diff --stat
For showing exactly the line numbers that has been changed you can use
git blame -p <file> | grep "Not Committed Yet"
And the line changed will be the last number before the ending parenthesis in the result. Not a clean solution though :(
Solution 2
Here's a bash function to calculate the resulting line numbers from a diff:
diff-lines() {
local path=
local line=
while read; do
esc=$'\033'
if [[ $REPLY =~ ---\ (a/)?.* ]]; then
continue
elif [[ $REPLY =~ \+\+\+\ (b/)?([^[:blank:]$esc]+).* ]]; then
path=${BASH_REMATCH[2]}
elif [[ $REPLY =~ @@\ -[0-9]+(,[0-9]+)?\ \+([0-9]+)(,[0-9]+)?\ @@.* ]]; then
line=${BASH_REMATCH[2]}
elif [[ $REPLY =~ ^($esc\[[0-9;]*m)*([\ +-]) ]]; then
echo "$path:$line:$REPLY"
if [[ ${BASH_REMATCH[2]} != - ]]; then
((line++))
fi
fi
done
}
It can produce output such as:
$ git diff | diff-lines
http-fetch.c:1: #include "cache.h"
http-fetch.c:2: #include "walker.h"
http-fetch.c:3:
http-fetch.c:4:-int cmd_http_fetch(int argc, const char **argv, const char *prefix)
http-fetch.c:4:+int main(int argc, const char **argv)
http-fetch.c:5: {
http-fetch.c:6:+ const char *prefix;
http-fetch.c:7: struct walker *walker;
http-fetch.c:8: int commits_on_stdin = 0;
http-fetch.c:9: int commits;
http-fetch.c:19: int get_verbosely = 0;
http-fetch.c:20: int get_recover = 0;
http-fetch.c:21:
http-fetch.c:22:+ prefix = setup_git_directory();
http-fetch.c:23:+
http-fetch.c:24: git_config(git_default_config, NULL);
http-fetch.c:25:
http-fetch.c:26: while (arg < argc && argv[arg][0] == '-') {
fetch.h:1: #include "config.h"
fetch.h:2: #include "http.h"
fetch.h:3:
fetch.h:4:-int cmd_http_fetch(int argc, const char **argv, const char *prefix);
fetch.h:4:+int main(int argc, const char **argv);
fetch.h:5:
fetch.h:6: void start_fetch(const char* uri);
fetch.h:7: bool fetch_succeeded(int status_code);
from a diff like this:
$ git diff
diff --git a/builtin-http-fetch.c b/http-fetch.c
similarity index 95%
rename from builtin-http-fetch.c
rename to http-fetch.c
index f3e63d7..e8f44ba 100644
--- a/builtin-http-fetch.c
+++ b/http-fetch.c
@@ -1,8 +1,9 @@
#include "cache.h"
#include "walker.h"
-int cmd_http_fetch(int argc, const char **argv, const char *prefix)
+int main(int argc, const char **argv)
{
+ const char *prefix;
struct walker *walker;
int commits_on_stdin = 0;
int commits;
@@ -18,6 +19,8 @@ int cmd_http_fetch(int argc, const char **argv, const char *prefix)
int get_verbosely = 0;
int get_recover = 0;
+ prefix = setup_git_directory();
+
git_config(git_default_config, NULL);
while (arg < argc && argv[arg][0] == '-') {
diff --git a/fetch.h b/fetch.h
index 5fd3e65..d43e0ca 100644
--- a/fetch.h
+++ b/fetch.h
@@ -1,7 +1,7 @@
#include "config.h"
#include "http.h"
-int cmd_http_fetch(int argc, const char **argv, const char *prefix);
+int main(int argc, const char **argv);
void start_fetch(const char* uri);
bool fetch_succeeded(int status_code);
If you only want to show added/removed/modified lines, and not the surrounding context, you can pass -U0
to git diff:
$ git diff -U0 | diff-lines
http-fetch.c:4:-int cmd_http_fetch(int argc, const char **argv, const char *prefix)
http-fetch.c:4:+int main(int argc, const char **argv)
http-fetch.c:6:+ const char *prefix;
http-fetch.c:22:+ prefix = setup_git_directory();
http-fetch.c:23:+
fetch.h:4:-int cmd_http_fetch(int argc, const char **argv, const char *prefix);
fetch.h:4:+int main(int argc, const char **argv);
It's robust against ANSI color codes, so you can pass --color=always
to git diff to get the usual color coding for added/removed lines.
The output can be easily grepped:
$ git diff -U0 | diff-lines | grep 'main'
http-fetch.c:4:+int main(int argc, const char **argv)
fetch.h:4:+int main(int argc, const char **argv);
In your case git diff -U0
would give:
$ git diff -U0 | diff-lines
test.txt:2:+new line here
test.txt:3:+another new line
test.txt:6:-will be removed
test.txt:6:-git repo
test.txt:6:+git
If you just want the line numbers, change the echo "$path:$line:$REPLY"
to just echo "$line"
and pipe the output through uniq
.
Solution 3
I use the --unified=0
option of git diff
.
For example, git diff --unified=0 commit1 commit2
outputs the diff:
Because of the --unified=0
option, the diff output shows 0 context lines; in other words, it shows exactly the changed lines.
Now, you can identify the lines that start with '@@', and parse it based on the pattern:
@@ -startline1,count1 +startline2,count2 @@
Back to the above example, for the file WildcardBinding.java, start from line 910, 0 lines are deleted. Start from line 911, 4 lines are added.
Solution 4
I had this same problem so I wrote a gawk script that changes the output of git diff to prepend the line number for each line. I find it useful sometimes when I need to diff working tree, although it's not limited to that. Maybe it is useful to someone here?
$ git diff HEAD~1 |showlinenum.awk
diff --git a/doc.txt b/doc.txt
index fae6176..6ca8c26 100644
--- a/doc.txt
+++ b/doc.txt
@@ -1,3 +1,3 @@
1: red
2: blue
:-green
3:+yellow
You can download it from here:
https://github.com/jay/showlinenum
Solution 5
Line numbers of all uncommitted lines (added/modified):
git blame <file> | grep -n '^0\{8\} ' | cut -f1 -d:
Example output:
1
2
8
12
13
14
Mahmoud Khaled
Updated on September 03, 2021Comments
-
Mahmoud Khaled over 2 years
Assuming I have a text file
alex bob matrix will be removed git repo
and I have updated it to be
alex new line here another new line bob matrix git
Here, I have added lines number (2,3) and updated line number (6)
How can I get these line numbers info using git diff or any other git command?
-
Mahmoud Khaled over 12 yearsstat only display how many lines are inserted/deleted/updated. But I need to know which line numbers
-
Mahmoud Khaled over 12 yearsisn't there any other way to get these info without using diff tool. Only using git commands?
-
Sedrik over 12 yearsThis seemed to be a harder problem than it should be, but I managed to get it by using git blame and grep. See my updated answer
-
Mikko Rantalainen about 12 yearsOne should usually call 'git blame -p' if the output is to be processed by other programs such as 'awk' or 'grep'.
-
New Alexandria over 11 yearsHow could I pass-through bash color escape codes? This is great, but the color codes coming from
git diff --color
do not come through. Or do you think it would be better just to add the color escapes into the return from this function? -
John Mellor over 11 yearsI updated the function so the various regexes are robust to ANSI color codes.
git diff --color | diff-lines
now works as expected :) -
Vitali over 10 yearsgit blame won't catch removed lines
-
markdrake almost 10 yearsThis solution works awesome! it should be marked as the answer as it really does what the OP asked. If it worked for you please up vote it so we can make it the popular answer :)
-
Hosh Sadiq over 9 yearsI keep getting this error using zsh:
zsh: parse error near `]+m'
Any ideas? The error comes from this line:elif [[ $REPLY =~ ^($esc\[[0-9;]+m)*([\ +-]) ]]; then
-
BlackVegetable over 9 yearsLooks very handy. Keep in mind this code has the advantage (or disadvantage) of being GPL licensed.
-
Koobz over 9 years@HoshSadiq Simply quoting the regular expression seems to have worked.
-
Saheel Godhane about 9 yearsGives erroneous numbering when a single added line is broken down into multiple lines using "\". This script increments the line number by just 1 whereas I added 10 lines (say). github.com/jay/showlinenum works fine!
-
Kasun Siyambalapitiya over 7 years@Sedrik can you help me to figure out this question [stackoverflow.com/questions/40839632/…
-
Kasun Siyambalapitiya over 7 yearswhat if
@@ -910,10,+911,15@@
or something, then how do we say exactly how many number of lines being added, deleted or modified -
fIwJlxSzApHEZIl over 7 yearswhat about the contents of the lines that were changed as well?
-
RaptoX over 5 yearsWow, this is exactly what I needed! Have been searching a lot for this!
-
Shardj over 4 yearsWhy is this marked as correct when it doesn't do what OP asked for?
-
Shardj over 4 yearsDo you have a good way to output the line numbers in a list like OP asked for?
-
Pro Q almost 4 yearsThe question asks for the line numbers for each line that has been changed, not a total of how many lines have been changed.
-
Gabriel Staples over 3 yearsI wrote
git diffn
to do this too, and it fully retains terminal colors and shows the line numbers of both the old file on the left and the new file on the right.