当我执行git diff
或git log -p
时,如何获取与输出内联的源文件的行号?
我试着查一查man git-diff | grep "line numbers"
,我尝试使用谷歌搜索,但没有迅速得到任何结果。
答案 0 :(得分:75)
git diff
目前没有任何选项可以在git diff
的旁边垂直显示行号。
这些信息在(c)hunk标题中可用于差异中的每个变化,但它只在unified-diff format中:
@@ -start,count +start,count @@
文件的原始状态用-
表示,新状态用+
表示(它们不代表hunk标头中的添加和删除。start
表示每个版本文件的起始行号,count
表示从起点开始包含的行数。
diff --git a/osx/.gitconfig b/osx/.gitconfig
index 4fd8f04..fcd220c 100644
--- a/osx/.gitconfig
+++ b/osx/.gitconfig
@@ -11,7 +11,7 @@ <== HERE!
[color "branch"]
upstream = cyan
[color "diff"]
- meta = yellow
+ meta = cyan
plain = white dim
old = red bold
new = green bold
hunk标题
@@ -11,7 +11,7 @@
说该文件的先前版本从第11行开始,包括7行:
11 [color "branch"]
12 upstream = cyan
13 [color "diff"]
14 - meta = yellow
14 + meta = cyan
15 plain = white dim
16 old = red bold
17 new = green bold
虽然该文件的下一个版本也从第11行开始,并且还包括7行。
正如您可能已经知道的那样,统一差异格式并不容易弄清楚行号(至少如果您不是机器)。如果你真的想要你可以阅读的行号,你需要使用一个可以为你显示它们的衍生工具。
答案 1 :(得分:16)
这是另外两个解决方案,扩展了Andy Talkowski的代码。
纯文字:
git diff | gawk 'match($0,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
/^(---|\+\+\+|[^-+ ])/{print;next};\
{line=substr($0,2)};\
/^-/{print "-" left++ ":" line;next};\
/^[+]/{print "+" right++ ":" line;next};\
{print "(" left++ "," right++ "):"line}'
彩色文字,假设\033[66m
是颜色代码的格式:
git diff --color=always | \
gawk '{bare=$0;gsub("\033[[][0-9]*m","",bare)};\
match(bare,"^@@ -([0-9]+),[0-9]+ [+]([0-9]+),[0-9]+ @@",a){left=a[1];right=a[2];next};\
bare ~ /^(---|\+\+\+|[^-+ ])/{print;next};\
{line=gensub("^(\033[[][0-9]*m)?(.)","\\2\\1",1,$0)};\
bare~/^-/{print "-"left++ ":" line;next};\
bare~/^[+]/{print "+"right++ ":" line;next};\
{print "("left++","right++"):"line;next}'
代码更改以-
或+
开头至-1:-
或+1:+
的行,以及以开头至
(5,6):
的行。数字是相应文件中的行号。
答案 2 :(得分:5)
这是一个试图解决这个问题的脚本 - 没有在愤怒中测试它,但似乎没问题。它依赖于git diff生成的记录,并使用awk来维护行数。
# Massage the @@ counts so they are usable
function prep1() {
cat | awk -F',' 'BEGIN { convert = 0; }
/^@@ / { convert=1; }
/^/ { if ( convert == 1 ) { print $1,$2,$3;
} else { print $0;
}
convert=0;
}'
}
# Extract all new changes added with the line count
function prep2() {
cat | awk 'BEGIN { display=0; line=0; left=0; out=1;}
/^@@ / { out=0; inc=0; line=$4; line--; display=line; left=line; }
/^[-]/ { left++; display=left; inc=0; }
/^[+]/ { line++; display=line; inc=0; }
/^[-+][-+][-+] / { out=0; inc=0; }
/^/ {
line += inc;
left += inc;
display += inc;
if ( out == 1 ) {
print display,$0;
} else {
print $0;
}
out = 1;
inc = 1;
display = line;
}'
}
git diff $1 | prep1 | prep2
答案 3 :(得分:4)
你可以尝试
git blame
在文件上。它显示了文件中每行的提交者,提交ID和行号。
答案 4 :(得分:3)
从2020年5月24日开始,您现在可以使用第三方工具git diffn
(完整披露:由我编写)。它是git diff
的轻量级包装,以awk
模式/基于动作的编程语言编写。这是运行git diffn
的示例输出:
说明:
git-diffn.sh
git diff
的替代品,它也显示行号'n'umbers!像git diff
一样精确地使用它们,除了您还会看到这些漂亮的行号以帮助您理解
您的更改。
因为它只是git diff
周围基于awk语言的轻量级包装,所以它接受git diff
接受的所有选项和参数。例子:
git diffn HEAD~
git diffn HEAD~3..HEAD~2
可以使用您的任何git diff
颜色设置,即使您使用的是自定义颜色
在此处查看我的答案,以了解如何设置自定义差异颜色,以及从git diffn
:How do you customize the color of the diff header in git diff?
以下是我上面回答中的一些示例git config
命令,用于设置自定义git diff
的颜色和属性(文本格式):
git config --global color.diff.meta "blue"
git config --global color.diff.old "black red strike"
git config --global color.diff.new "black green italic"
git config --global color.diff.context "yellow bold"
git diffn
中的,默认情况下颜色输出为ON;如果要禁用输出颜色,则必须使用--no-color
或--color=never
。有关详细信息,请参见man git diff
。例子:
git diffn --color=never HEAD~
git diffn --no-color HEAD~3..HEAD~2
gawk
。如果是这样,请尝试this:brew install gawk
。 选项1(我的建议):下载整个存储库,然后创建该程序的符号链接,以便您可以随时通过在存储库中执行git pull
来轻松接收更新
首先,cd
至您要安装此文件的位置。然后运行:
git clone https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
cd eRCaGuy_dotfiles/useful_scripts
mkdir -p ~/bin
ln -si "${PWD}/git-diffn.sh" ~/bin/git-diffn
完成!现在只需执行下面的最后一步!
选项2(对于只需要1个文件的用户):一次只下载一个文件。
mkdir -p ~/bin
cd ~/bin
wget https://raw.githubusercontent.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/master/useful_scripts/git-diffn.sh
chmod +x git-diffn.sh
mv git-diffn.sh git-diffn
完成!现在只需执行下面的最后一步!
最后一步:
现在关闭并重新打开您的终端,或使用. ~/.bashrc
重新获得它,您就完成了!
git diffn
现在可以作为git diff
的精确替代品!
这是一个演示:
git diffn
的演示:创建此文件:
hello_world.c:
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
提交:
git add hello_world.c
git commit -m "add hello_world.c"
将其更改为此并保存文件:
hello_world.c:
// Basic hello world example
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("Hello Gabriel\n");
int i = 700;
printf("i = %i\n", i);
return 0;
}
现在运行:
git diff
出于比较目的,以下是git diff
的输出:
$ git diff
diff --git a/hello_world.c b/hello_world.c
index e01704a..e971b73 100644
--- a/hello_world.c
+++ b/hello_world.c
@@ -1,8 +1,12 @@
+// Basic hello world example
+
#include <stdio.h>
-int main()
+int main(int argc, char *argv[])
{
- printf("Hello World\n");
-
+ printf("Hello Gabriel\n");
+
+ int i = 700;
+ printf("i = %i\n", i);
return 0;
-}
\ No newline at end of file
+}
以及显示颜色的屏幕截图。请注意,红色突出显示部分只是显示可以删除的空白(在这种情况下为空格):
现在这是git diffn
的输出。注意,它完美地显示了所有行号!
-
的最左和右侧均显示一个:
符号,以帮助您更好地查看-您的眼睛是想向下浏览到结肠的右侧还是向下浏览屏幕的最左端。+
的最左侧和右侧均显示一个:
符号。,
分隔。 git diffn
的输出:
$ git diffn
diff --git a/hello_world.c b/hello_world.c
index e01704a..e971b73 100644
--- a/hello_world.c
+++ b/hello_world.c
@@ -1,8 +1,12 @@
+ 1:+// Basic hello world example
+ 2:+
1, 3: #include <stdio.h>
2, 4:
- 3 :-int main()
+ 5:+int main(int argc, char *argv[])
4, 6: {
- 5 :- printf("Hello World\n");
- 6 :-
+ 7:+ printf("Hello Gabriel\n");
+ 8:+
+ 9:+ int i = 700;
+ 10:+ printf("i = %i\n", i);
7, 11: return 0;
- 8 :-}
\ No newline at end of file
+ 12:+}
以及显示颜色的屏幕截图。请注意,冒号没有进行着色或样式化以匹配左右两侧的周围文本。这是有意行为,它是设计好的行为,可以用作在左侧添加的行号和在右侧添加的原始git diff
输出之间的可视分隔符。
答案 5 :(得分:1)
您可以使用git difftool
使用将显示行号的外部编辑器来执行差异。以下是使用vim / vimdiff的方法:
将vimdiff设为git&#39; s difftool:
git config --global diff.tool vimdiff
配置~/.vimrc
以在使用vimdiff时自动显示行号:
if &diff
set number
endif
运行git difftool,它将使用带行号的vimdiff:
git difftool
答案 6 :(得分:1)
我喜欢将git difftool
与 meld 一起用作我的difftool。它比git diff
更容易看,有一个很好的并排gui比较,并显示行号。
答案 7 :(得分:0)
快速方法是使用git diff -U0
。这会将上下文行设置为0,这将使@@值与实际更改的行匹配。默认情况下,@@值包括3行前/后上下文,这对人类来说不方便。
示例:
git diff # default
@@ -10,8 +10,8 @@
这很难计算更改行的行号,因为第10行指的是前一个上下文的第一行。第一个更改行的实际行号是10 + 3 = 13。要计算更改行的数量,您还必须减去前后上下文:8-3-3 = 2.
git diff -U0
@@ -13,2 +13,2 @@
如您所见,设置context = 0使人类更容易阅读@@值。您可以看到更改的行从第13行开始,并且有2行已更改。
这并不完美,因为它只显示每个块的行号。如果要查看每一行的行号,请使用difftool作为外部编辑器。见https://stackoverflow.com/a/50049752
答案 8 :(得分:0)
您可以随时使用cat。缺点是您会失去颜色。
示例:
git diff yourfile.cpp | cat -n
答案 9 :(得分:0)
首先,配置您的git diff工具,例如融化
git config --global diff.tool meld
然后,将difftool拖到某些文件上:
git difftool -y config.rb
记住在差异工具的首选项中设置行号。