Git diff只显示已修改的行

r3b*_*00t 107 git

当我做一个git diff时,它会显示已添加的行:

+ this line is added
Run Code Online (Sandbox Code Playgroud)

已删除的行:

- this line is removed
Run Code Online (Sandbox Code Playgroud)

但它也显示了许多未修改的行:

this line is not modified
this line is also not modified
Run Code Online (Sandbox Code Playgroud)

这导致实际的git diff看起来像这样:

+ this line is added
  this line is not modified
- this line is removed
  this line is not modified
Run Code Online (Sandbox Code Playgroud)

我可以要求git只显示已修改的行并忽略所有其他未修改的代码吗?我写了一个方法,它将删除所有在它们前面没有"+"或" - "符号的行,但我相信必须有一个更简单的方法来执行此操作.

在我的git diff中,我只对看到已修改的行感兴趣.

提前致谢.

Chr*_*yes 150

What you want is a diff with 0 lines of context. You can generate this with:

git diff --unified=0
Run Code Online (Sandbox Code Playgroud)

or

git diff -U0
Run Code Online (Sandbox Code Playgroud)

You can also set this as a config option for that repository:

git config diff.context 0
Run Code Online (Sandbox Code Playgroud)

To have it set globally, for any repository:

 git config --global diff.context 0
Run Code Online (Sandbox Code Playgroud)

  • @Rakesh:为了扩展,git-diff尝试创建实际上可以用作源文件补丁的差异,如果没有这些信息,这是不可能的.删除它的唯一方法是自己进行后处理,例如通过`git diff | egrep"^(\ + | - )"`. (7认同)
  • 谢谢你的快速回复.这解决了我的问题的一半,但我仍然在我的差异中得到一些像"@@ -1 +1 @@"的行,而我的git diff的顶部有"diff --git a/db/xxxxxxx b/db/xxxx index" xxxxx..aaaaaa bbbbbbbb (3认同)
  • 我不认为git提供任何方法来避免输出这些行,因为如果没有它们,diff就没有意义(你不知道你在看哪个文件,也不知道你在文件中的位置). (2认同)

use*_*654 31

另劈(关于联合国*X),以显示只是开始的行+-:

git diff -U0 | grep '^[+-]' | grep -Ev '^(--- a/|\+\+\+ b/)'
Run Code Online (Sandbox Code Playgroud)

上面的代码执行以下操作:

  • git diff -U0:选择0上下文行
  • 第一个grep只包含以+or 开头的所有行-
  • 第二个grep排除以--- a/或开头的行+++ b/

注: -上述解决方案将需要被修改,如果你使用其他git的差异选项,如-R,--src-prefix,--dst-prefix,--no-prefix,... -这两个里grep可以组合成一个单一的grep -E -v '^(\+\+\+ b/|--- a/|@@ |diff --git|index )',但我觉得双grep的版本更容易理解.

  • 好一个。为每个过滤器的清晰解释点赞。 (2认同)

sim*_*leo 6

关注Chris的最新评论,后处理的主要问题是你想要保持行开头,-|+但你也想要过滤掉那些开头的行---|+++.另一方面,如果你在你的仓库中存储补丁文件(我在Pydoop中),你想要保留以开头的行--|++,所以regexp变得有点涉及:

git diff | grep -P '^\+(?:(?!\+\+))|^-(?:(?!--))'
Run Code Online (Sandbox Code Playgroud)

正则表达式使用负向前瞻:请参阅Peter Boughton 对此问题的回答以获得详细解释.

如果经常这样做,您可能想为它设置一个git别名:

git config --global alias.diffonly '!git diff | grep -P "^\+(?:(?!\+\+))|^-(?:(?!--))"'
Run Code Online (Sandbox Code Playgroud)


gal*_*ois 6

我认为对于简单的情况,正则表达式可以更短更容易记住,但需要注意的是,如果您在行本身以+-

$ git diff | grep '^[+|-][^+|-]'
Run Code Online (Sandbox Code Playgroud)

正则表达式表示该行应以+or开头,-紧随其后的字符不应是这两者之一。无论我是否+在这里逃脱,我都得到了相同的结果,顺便说一句...


例子:

$ cat testfile
A
B
C
D
E
F
G
Run Code Online (Sandbox Code Playgroud)

说我的变化CXEY,并GZ

$ git diff | grep '^[+|-][^+|-]'
-C
+X
-E
+Y
-G
+Z
Run Code Online (Sandbox Code Playgroud)

不过,就像我上面说的,这仅适用于大多数情况。如果您将该输出通过管道传输到文件dout,然后尝试使用相同的正则表达式,它将不起作用。

$ git diff dout | grep '^[+|-][^+|-]'
$
Run Code Online (Sandbox Code Playgroud)

无论如何,希望对您的情况有所帮助


归档时间:

查看次数:

37196 次

最近记录:

6 年 前