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


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


当前回答

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

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

其他回答

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

git diff --stat <commit-hash>

Use:

git diff --name-only

往前走!

试着使用:

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

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

git diff | grep -B 5 dd\(

最干净的输出,也就是文件名/路径

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

它并不漂亮,但这里有一句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

解释:

git diff——统一=0头~1..头

从Git中检索提交信息

grep -Po '(^diff——git [a-zA-Z/._]*|^@@.*@@)'

建立在先前的答案上,并筛选到包含 文件名和行号

为了提高可读性,将一行代码扩展为多行代码:

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

转换为预期输出的字符串解析:

file/name1.txt:34
file/name2.txt:98
file/name2.txt:101
file/name3.txt:2