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

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


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

【问题讨论】:

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

标签: git git-diff


【解决方案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~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 &lt;filename&gt; 的文件名或匹配来自@@@ &lt;from-file-range&gt; &lt;from-file-range&gt; &lt;to-file-range&gt; 的行号或匹配@@@ 之后的剩余文本。
        2. sed -e '0~3{s/ @@@[ ]\?//}':从每 3 行删除 @@@[ ]\?,以获取 ++&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD 之前的可选 1 行上下文。
        3. sed '2~3 s/$/\n1/g':在第 2 行和第 3 行之间每 3 行添加 \n1 作为列号。
        4. 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\(
              

              【讨论】:

                猜你喜欢
                • 2017-10-28
                • 2019-10-02
                • 2011-03-18
                • 2014-10-19
                • 2013-01-11
                • 2011-04-24
                • 2015-12-22
                • 2018-06-10
                • 1970-01-01
                相关资源
                最近更新 更多