这个问题需要“行号”。如果您不关心输出中的行号,请参阅此问题和答案。
基本上,我不想看到更改的内容,只是文件名和行号。
采用:
git diff --name-only
去区分吧!
行号是更改的行数还是包含更改的实际行号?如果您想要更改的行数,请使用git diff --stat
. 这会给你一个像这样的显示:
[me@somehost:~/newsite:master]> git diff --stat
whatever/views/gallery.py | 8 ++++++++
1 files changed, 8 insertions(+), 0 deletions(-)
没有选项可以获取更改本身的行号。
注意:如果您只是在查找已更改文件的名称(没有已更改行的行号),请在此处查看另一个答案。
对此没有内置选项(我也不认为它很有用),但可以在“外部差异”脚本的帮助下在 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 手册页GIT_EXTERNAL_DIFF
上的描述(大约第 700 行,非常接近结尾)。
采用:
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)我最喜欢的:
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
显示从现在到指定提交之间每个文件中更改的文件名和行数/数量:
git diff --stat <commit-hash>
在 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
最干净的输出,即仅文件名/路径,附带
git diff-tree --no-commit-id --name-only -r
在 上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':'
例如,统一的差异:
$ 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
grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? )
: 匹配文件名来自diff --cc <filename>
OR 匹配行号来自@@@ <from-file-range> <from-file-range> <to-file-range>
OR 匹配 . 之后的剩余文本@@@
。sed -e '0~3{s/ @@@[ ]\?//}'
:@@@[ ]\?
从每第 3 行中删除以获取之前的可选 1 行上下文++<<<<<<< HEAD
。sed '2~3 s/$/\n1/g'
:\n1
在第 2 行和第 3 行之间每 3 行添加列号。sed "N;N;N;s/\n/:/g"
: 每 3 行加入一个:
.我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 dif | grep -B <number of before lines to show> <regex>
就我而言,我试图搜索我在许多文件中放置调试语句的位置。我需要查看哪个文件已经得到了这样的调试语句:
git diff | grep -B 5 dd\(