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

时间:2012-03-24 01:24:45

标签: git git-diff

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

12 个答案:

答案 0 :(得分:681)

这么容易:

git diff --name-only

前进并分享!

答案 1 :(得分:59)

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

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

没有选项可以自行获取更改的行号。

答案 2 :(得分:52)

注意:如果您仅查找已更改文件的名称 行号,则更改的行) that's easy, click this link to 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行左右,非常接近结尾)。

答案 3 :(得分: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

答案 4 :(得分:2)

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

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

HTH

答案 5 :(得分:2)

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

git diff --stat <commit-hash>

答案 6 :(得分:1)

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

答案 7 :(得分:1)

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:没关系,没人回答过。

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

答案 9 :(得分:0)

git diff到文件之间的每一行

git diff --name-only列出名称文件

答案 10 :(得分:0)

我使用import java.util.Scanner; public class PlanetInfo { public static void main (String [] args){ Planet mcy = Planet.MERCURY; Planet vns = Planet.VENUS; Planet rth = Planet.EARTH; Planet mrs = Planet.MARS; Planet jpt = Planet.JUPITER; Planet strn = Planet.SATURN; Planet urn = Planet.URANUS; Planet npt = Planet.NEPTUNE; Scanner kb = new Scanner(System.in); System.out.println("Terrestrial planets:"); for (Planet p : Planet.values()){ if(p.equals(false)){ System.out.println(p); } } System.out.println("Enter a planet name:"); String line = kb.nextLine().toUpperCase(); switch(line){ case "MERCURY": System.out.println(mcy + " has "+ mcy.getMoon()+" moons."); break; case "VENUS" : System.out.println(vns + " has "+ vns.getMoon()+" moons."); break; case "EARTH": System.out.println(rth + " has "+ rth.getMoon()+" moons."); break; case "MARS": System.out.println(mrs + " has "+ mrs.getMoon()+" moons."); break; case"JUPITER": System.out.println(jpt + " has "+ jpt.getMoon()+" moons."); break; case "SATURN": System.out.println(strn + " has "+ strn.getMoon()+" moons."); break; case "URANUS": System.out.println(urn + " has "+ urn.getMoon()+" moons."); break; case "NEPTUNE": System.out.println(npt + " has "+ npt.getMoon()+" moons."); break; default: System.out.println("error, not a planet"); } } } 作为幼稚的解决方案。

grep

输出示例:

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

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

答案 11 :(得分:0)

您是否尝试过使用:

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

在我的情况下,我尝试搜索在许多文件中放置调试语句的位置,我需要查看哪个文件已获得此调试语句,如下所示:

git diff | grep -B 5 dd\(