我可以仅使行号和更改的文件名成为“ git diff”吗?


276

这个问题要求“行号”,如果您不关心输出中的行号,请参阅此问题和答案


基本上,我不希望看到更改的内容,而只看到文件名和行号。


我很好奇,如果没有代码,行号真的有用吗?还是您要更改行数?
安德鲁·马歇尔

是的,不是特别重要,但是我需要在更改代码的地方添加书签。
2012年

1
这方面的一个用法是将信息以代码覆盖率报告相结合,以评估是否在一个新的或修改后的代码提交测试所覆盖
AntonyG

@AntonyG我在尝试构建一个功能完全相同的实用程序(覆盖率与更改的行)时发现了这个问题。您设法建立报告了吗?如果是这样,您是否将其发布在任何地方?
Andrew Newdigate

@AndrewNewdigate这将是一个很酷的工具,但我从未构建过它。当我遇到这个问题时,我还在进行其他类型的代码覆盖率结果处理,但是无法证明实施我的建议所需的时间
AntonyG 2016年

Answers:


70

注意:如果您只是在寻找已更改文件的名称包含已更改行的行号),那很容易,请单击此链接到此处的另一个答案


有没有内置的选项,这个(我不认为这一切都让无论是有用的),但它有可能做到这一点的混帐,与“外部差异”脚本的帮助。

这是一个很烂的家伙。您可以根据自己的意愿来调整输出。

#! /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 '^[<>-]'

有关“外部差异”详情,请参阅的说明GIT_EXTERNAL_DIFFgit的手册页(左右线700,相当接近结束)。


1
谢谢。在确认没有内置选项之后,我实际上写了一个类似的脚本,:)
wei

| grep -o '^[0-9]*'假设您不关心右侧,则使用管道给您提供的只是数字。
GKFX

1
@DylanYoung是的;要限制显示的文件,请在文档--diff-filter=......部分添加您要查看的更改类型:M已修改,A已添加,D已删除以及其他git diff
torek '18

@Sventies:这不是OP所要求的,正如我在回答的顶部指出的那样。他不想仅使用文件。他想要带行号名字
torek '19

足够公平@torek :)
Sventies,

831

太简单:

git diff --name-only

来比较吧!


88
这是大多数人在查看此页面时正在寻找的答案(这是给我的)。但是,它无法回答原始问题,该问题专门提到了行号。
PieterMüller2013年

12
这不应是公认的答案,因为它只能解决一半的问题-您仍然需要输出(对于每个文件)已更改的行。
adamwong246

而已!我正是在寻找此开关!
亚当·阿罗德

为什么不使用“ git status”?它还会告诉您未跟踪的文件。
Naveen Paul

1
@JimmyPaul,因为有时您已经提交了。例如,您需要在master和当前的高级分支之间列出更改的文件git diff --name-only master..HEAD
Hettomei'1

68

行号与已更改的行数一样,还是包含更改的实际行号?如果要更改的行数,请使用git diff --stat。这样可以显示如下:

[me@somehost:~/newsite:master]> git diff --stat
 whatever/views/gallery.py |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

没有选择本身可以获取更改的行号。


1
我在想实际的行号。不过谢谢
2012年

我以某种方式怀疑他是否希望为此使用GUI工具。
ThiefMaster 2012年

30

git diff master --compact-summary

输出为:

 src/app/components/common/sidebar/toolbar/toolbar.component.html   |  2 +-
 src/app/components/common/sidebar/toolbar/toolbar.component.scss   |  2 --

这正是您所需要的。与您进行提交或从远程提取新提交时的格式相同。

PS:这说明没有人回答。


1
没有指定。它从一年前发布的2.18开始运行。
Seitbekir Seidametov '19

完善。这为我工作,反应是完美的。
维克多

15

1)我的最爱:

git diff --name-status

附加文件状态,例如:

A   new_file.txt
M   modified_file.txt 
D   deleted_file.txt

2)如果要统计,则:

git diff --stat

将显示如下内容:

new_file.txt         |  50 +
modified_file.txt    | 100 +-
deleted_file         |  40 -

3)最后,如果您只想要文件名:

git diff --name-only

只会显示:

new_file.txt
modified_file.txt
deleted_file

4

显示从现在到指定的提交之间每个文件中更改的文件名和行数/行数:

git diff --stat <commit-hash>

2

我知道这是一个老问题,但是在Windows上,这会将git输出过滤到文件中并更改行号:

(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>

要从中提取文件和更改的行需要更多的工作:

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

1

附带了最干净的输出,即仅文件名/路径

git diff-tree --no-commit-id --name-only -r

高温超导


0

在上git version 2.17.1没有内置标志可实现此目的。

这是一个示例命令,用于从统一的diff过滤掉文件名和行号:

git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'

例如,统一差异:

$ 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

将导致:

❯ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'
foobar:1

要在通用grep匹配结果中匹配命令的输出:

$ 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
  1. grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? ):匹配diff --cc <filename>OR中的文件名或OR中匹配的行号@@@ <from-file-range> <from-file-range> <to-file-range>匹配后的其余文本@@@
  2. sed -e '0~3{s/ @@@[ ]\?//}'@@@[ ]\?从第3行中删除以获取之前的可选1行上下文++<<<<<<< HEAD
  3. sed '2~3 s/$/\n1/g'\n1在第二行和第三行之间每三行添加一列。
  4. sed "N;N;N;s/\n/:/g":每3行加入一个:

0

grep用作天真的解决方案。

$ git diff | grep -A2 -- '---'

输出示例:

--- 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 @@

也许您可以看到彩色输出。它可以帮助您轻松读取输出。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.