在git diff中,我能只显示没有后续添加的删除吗?

4
我希望能在git diff中显示未跟随添加的删除。 也就是说,只显示没有后续 + 行的 - 行。这个有可能吗?

不直接使用Git。你可以让Git或其他工具生成差异,然后自己检查和编辑它,在你自己的代码中进行操作。或者,你可以使用一个差异引擎来生成编辑序列,并在此基础上进行自己的工作。 - torek
4个回答

1
git diff | awk '/^@/{ if(s) print p; s = 1; p="" } 
    s == 1 && /^\+/ { s = 0 } 1 {p = sprintf("%s\n%s", p, $0)} 
    END { if (s) print p }' s=2

1
git diff --numstat | awk '/^0/ {print $3}'

git-diff的手册中:
--numstat选项提供了diffstat(1)信息,但是它设计用于更容易被机器消费。--numstat输出中的条目如下所示:
1 2 README 3 1 arch/{i386 => x86}/Makefile 也就是说,从左到右依次是:
1. 添加行数; 2. 制表符; 3. 删除行数; 4. 制表符; 5. 文件路径(可能包含重命名/复制信息); 6. 换行符。

0
使用一点黑魔法,是的。
第一步
我们需要了解
git diff
列出文件、变更集、删除、添加以及其周围的一些行。
第二步
我们需要移除所有多余的行,使我们只获得文件和其中的变更,就像这样:
git diff | grep '^\(\+\+\+\|---\|-\|\+\)'

步骤3

编写一个运行在步骤2中看到的命令并显示结果的程序。我知道这还不是解决方案,但您绝对需要先执行这一步,以确保输入和输出正常工作。

步骤4

现在,让我们应用过滤。一个非常简单的过滤器可以通过这个算法来执行。

deletedLines <- empty
for each line
    if (line starts with --- or +++) then add line to output
    else if (line starts with -) deletedLines.add(line)
    else
        if (line starts with + but not with +++) then clear deletedLines
        else add deletedLines to output
end for

git diff | grep '^\(+++\|---\|-\|+\)' 对我来说没有起作用。 - Geremia
@Geremia,你能详细说明一下它对你来说为什么不起作用吗? - Lajos Arpad
它没有产生任何输出。 - Geremia
@Geremia,你能提出一个问题,其中包含重现此问题所需的详细信息,并在这里分享链接吗?我想调查此事。 - Lajos Arpad
1
"git diff | grep '^(+++|---|-|+)'" produces no output. 可能是因为我的diff输出被着色了。 - Geremia

0

一种替代方案,只需一行代码,使用正则表达式即可。在这里,我使用了rg,但任何支持多行匹配和反向匹配(分别为-U-v)的grep工具都可以使用。

git diff | rg '^(\+ |- ).*' | rg -vU '^-(.*)\n\+(.*)\n'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接