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

时间:2014-08-26 04:08:01

标签: git diff git-diff

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

有关:

git diff HEAD --no-ext-diff --unified=0 --exit-code -a --no-prefix

它显示:

diff --git file1 file2
index d9db605..a884b50 100644
--- file1
+++ file2
@@ -16 +16 @@ bla bla bla
-old text
+new text

我想看的只是:

new text

有可能吗?

6 个答案:

答案 0 :(得分:13)

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

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

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

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

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

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

git diff --color=always|ruby -wne 'p $_'

答案 1 :(得分:6)

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

git diff HEAD --no-ext-diff --unified=0 --exit-code -a --no-prefix | egrep "^\+"

这基本上是你的代码,用正则表达式传递到egrep命令。正则表达式只会过滤以加号开头的行。

答案 2 :(得分:2)

您可以使用:

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

这会将您的输出设为&#34; +新文字&#34;

答案 3 :(得分:1)

如果您希望该过程是自动的,对于单个文件,您可以使用 diff 而不是 git diff,这样做:

diff --changed-group-format='%>' --unchanged-group-format='' <( git show HEAD:myfile.ext ) myfile.ext
  • <( ) 使 diff 使用 git show HEAD:myfile.ext 的结果作为第一个输入
  • --changed-group-format='%>' 告诉 diff 输出添加的行
  • --unchanged-group-format='' 告诉 diff 对于删除的行不输出任何内容

要获取提交的信息(不是当前工作树修改的信息),您甚至可以这样做

diff --changed-group-format='%>' --unchanged-group-format='' <( git show _SHA_~:myfile.ext ) <( git show _SHA_:myfile.ext )

其中 _SHA_ 是对提交的任何引用(SHA、分支、标签等)

(对于那些想知道我为什么需要这个的人:我有一个“update.sql”文件,其中放置了所有 SQL 语句。因此,在项目更新时,我必须找到添加了哪些行,让Mysql执行它们)。

我在 this answer

中找到了这些差异选项

答案 4 :(得分:0)

以下是使用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'

说明:

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

答案 5 :(得分:0)

不幸的是,颜色的东西对 Windows 来说不是那么便携(使用 unxutils 支持的命令)。但是有一个解决方案可以解决使用颜色模式解决的+++问题。

此外,我们可能也不想要主角。所以一旦我们匹配到它,让我们使用 sed 来摆脱它:

git diff --no-ext-diff --unified=0 -a --no-prefix --output-indicator-new=% | sed -n "s/^%\(.*\)$/\1/p"

如果你想删除行:

git diff --no-ext-diff --unified=0 -a --no-prefix --output-indicator-old=% | sed -n "s/^%\(.*\)$/\1/p"

通过将 % 替换为 +,您不必担心以 +++ 开头的标题行(b/c git 没有在那里使用该前缀......但是这可能会改变,这仍然是一个瓷器命令)

前缀字符必须是 ASCII(所以不要对 unicode 感兴趣)。鉴于 Windows/Linux/sed 语法的变幻莫测。我认为,唯一不需要在某处转义的 ASCII 字符是:%,_~

根据您的需要,您可能希望删除 -a,因为二进制文件可能会把事情弄得一团糟。

另一个答案中提到的

--exit-code 是一个 noop。通过管道运行,我们只能得到第二个退出代码(在 Windows 和 Linux 上都测试过)