我可以让“git diff”只显示行号和更改的文件名吗?

Posted

技术标签:

【中文标题】我可以让“git diff”只显示行号和更改的文件名吗?【英文标题】:Can I make 'git diff' only display the line numbers AND changed file names? 【发布时间】:2012-04-08 13:16:18 【问题描述】:

这个问题需要“行号”。如果您不关心输出中的行号,see this question and answer。


基本上,我不想看到改变的内容,只是文件名和行号。

【问题讨论】:

我很好奇,没有代码的行号真的有用吗?还是要更改行数? 好吧,不是特别的,但我需要它来标记我更改代码的地方。 一种用法是将信息与代码覆盖率报告结合起来,以评估提交中的新代码或修改后的代码是否被测试覆盖 @AntonyG 我在尝试构建一个功能完全相同的实用程序时发现了这个问题(覆盖与更改的行)。您是否设法构建报告?如果有,您是否在任何地方发布过? @AndrewNewdigate 这将是一个很酷的工具,但我从未构建过它。当我遇到这个问题时,我正在做一些其他类型的代码覆盖结果处理,但无法证明实施我的建议所需的时间 【参考方案1】:

行号是更改的行数还是包含更改的实际行号?如果您想要更改的行数,请使用git diff --stat。这会给你一个这样的显示:

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

无法自行获取更改的行号。

【讨论】:

我在想实际的行号。不过还是谢谢。 我有点怀疑他是否需要一个 GUI 工具。【参考方案2】:

注意:如果您只是查找已更改文件的名称没有行号表示已更改的行),见another answer here。


对此没有内置选项(我认为它也不是很有用),但是在“外部差异”的帮助下 在 Git 中可以做到这一点" 脚本。

这是一个非常糟糕的;您可以按照自己喜欢的方式修复输出。

#! /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 manual page 上对GIT_EXTERNAL_DIFF 的描述(大约第 700 行,非常接近结尾)。

【讨论】:

谢谢。在确认没有内置选项之后,我实际上已经编写了一个类似的脚本,:) 管道到| grep -o '^[0-9]*' 只给你数字,假设你不关心右手边。 @DylanYoung 是的;要限制显示的文件,请添加--diff-filter=...,其中... 部分是您想要查看的更改类型:M 用于修改,A 用于添加,D 用于删除,以及其他根据@987654331 @ 文档。 @Sventies:这不是 OP 所要求的,正如我在答案顶部指出的那样。他不想要文件的名称。他想要名称带有行号 很公平@torek :)【参考方案3】:

用途:

git diff --name-only

去区分吧!

【讨论】:

这可能是大多数人在查看此页面时正在寻找的答案(这是给我的)。但是,它没有回答原始问题,其中特别提到了行号。 这不应该是公认的答案,因为它只解决了一半的问题——您仍然需要输出哪些行(对于每个文件)发生了更改。 就是这样!我正在寻找这个开关! 为什么不使用“git status”?它还会告诉您未跟踪的文件。 @JimmyPaul 因为有时你已经提交了。例如,您需要列出 master 和当前高级分支之间更改的文件 git diff --name-only master..HEAD【参考方案4】:

在 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

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

git diff --stat <commit-hash>

【讨论】:

【参考方案7】:

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

这是一个从统一差异中过滤掉文件名和行号的示例命令:

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

例如统一的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

将导致:

❯ 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~3s/ @@@[ ]\?//' | 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]+)? ):匹配来自diff --cc &lt;filename&gt; 的文件名或匹配来自@@@ &lt;from-file-range&gt; &lt;from-file-range&gt; &lt;to-file-range&gt; 的行号或匹配@@@ 之后的剩余文本。 sed -e '0~3s/ @@@[ ]\?//':从每 3 行删除 @@@[ ]\?,以获取 ++&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD 之前的可选 1 行上下文。 sed '2~3 s/$/\n1/g':在第 2 行和第 3 行之间每 3 行添加 \n1 作为列号。 sed "N;N;N;s/\n/:/g":每 3 行加入一个 :

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

用途:

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:奇怪的是没人这样回答。

【讨论】:

未指定。它从一年前发布的 2.18 开始工作。 完美。这对我有用,而且反应很完美。【参考方案10】:

我使用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 @@

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

【讨论】:

【参考方案11】:

尝试使用:

git dif | grep -B <number of before lines to show> <regex>

在我的例子中,我试图搜索我在许多文件中放置调试语句的位置。我需要看看哪个文件已经有了这样的调试语句:

git diff | grep -B 5 dd\(

【讨论】:

以上是关于我可以让“git diff”只显示行号和更改的文件名吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 git diff,如何获得添加和修改的行号?

为啥 Git Diff/Patch 信息与该补丁的 Github 表示不同?

sh git diff list只更改了文件的名称

sh git diff list只更改了文件的名称

在暂存区的文件中显示 git diff [重复]

git diff 文件针对其最后一次更改