Git diff:是否可以显示仅更改的行

Art*_*tem 20 git diff git-diff

我试图只获得已更改的新版本的行,而不是git diff显示的所有其他信息.

对于:

git diff HEAD --no-ext-diff --unified=0 --exit-code -a --no-prefix
Run Code Online (Sandbox Code Playgroud)

表明:

diff --git file1 file2
index d9db605..a884b50 100644
--- file1
+++ file2
@@ -16 +16 @@ bla bla bla
-old text
+new text
Run Code Online (Sandbox Code Playgroud)

我想看的只是:

new text
Run Code Online (Sandbox Code Playgroud)

可能吗?

mic*_*has 14

只有添加的行在所有情况下都没有意义.如果你替换了一些文本块并且你发生了包含之前存在的单行,那么git必须匹配并猜测.- 通常输出git diff可以用作patch之后的输入,因此是有意义的.只有添加的行没有精确定义,因为在某些情况下git必须猜测.

如果你仍然想要它,你就不能+单独相信一个领先的标志.也许过滤所有绿线更好:

git diff --color=always|perl -wlne 'print $1 if /^\e\[32m\+\e\[m\e\[32m(.*)\e\[m$/'
Run Code Online (Sandbox Code Playgroud)

仅对于所有红线的已删除行过滤:

git diff --color=always|perl -wlne 'print $1 if /^\e\[31m-(.*)\e\[m$/'
Run Code Online (Sandbox Code Playgroud)

检查您可以使用的输出中的颜色代码:

git diff --color=always|ruby -wne 'p $_'
Run Code Online (Sandbox Code Playgroud)

  • 文件头以`+++`开头,如果你添加一个带有两个加号的行,你也会得到'+++`.你可以用更多的解析逻辑来解决这个问题,但只是采用绿线看起来更容易. (4认同)

met*_*bed 7

如果您只想要该new text部件,请使用以下内容:

git diff HEAD --no-ext-diff --unified=0 --exit-code -a --no-prefix | egrep "^\+"
Run Code Online (Sandbox Code Playgroud)

这基本上就是你的代码,egrep用正则表达式传递给命令.正则表达式将仅过滤以加号开头的行.


小智 5

您可以使用:

git diff -U0 <commit-hash> | grep "^\+\""

这将使您的输出为“+新文本”


wis*_*cky 5

这是一个使用的答案grep。它保留了原始的红/绿颜色以提高可读性。我提供了一些语法变化:

git diff --color | grep --color=never $'^\e\[3[12]m'
git diff --color | grep --color=never $'^\033\[3[12]m'
git diff --color | grep --color=never -P '^\e\[3[12]m'
git diff --color | grep --color=never -P '^\033\[3[12]m'
Run Code Online (Sandbox Code Playgroud)

解释:

  • git diff --color需要防止 git 在管道传输时禁用颜色。
  • grep --color=never防止 grep 突出显示匹配的字符串(这会从原始命令中删除原始颜色)
  • 匹配以红色 ( \e[31m) 或绿色 ( \e[32m) 转义码开头的行。
  • $'...'(ANSI-C 引用语法)或(-Pperl 语法)是让将orgrep解释为字符。\e\033ESC