Diff只改变了部分线条

xx7*_*aBs 14 git bash diff

是否可以仅显示旧线和新线之间的差异git diff

这是文件a.txt的内容:

123456789

这是文件b.txt的内容

123455789

这是正常git diff输出:

正常输出

这就是我想要完成的事情: 想要输出

我更喜欢这样做git diff,但如果不能这样做,我可以使用任何其他应用程序.

Eta*_*ner 15

这是可行的--word-diff选择git diff.虽然默认情况下没有达到该级别的粒度.

要获得像这样的单字符差异,也需要自定义--word-diff-regex.(我'([^[:alnum:]]|[^[:space:]])'在这里有一个git别名,但这似乎是这样做的.虽然这不是我写的时候.)

可以缩写--word-diff=color --word-diff-regex='...'--color-words='...'的方式了.

看看是否符合您的要求:

$ cat worddiff.awk
BEGIN {
    RS="\n?~\n"
    FS="\n"
}

# Special case the diff header/chunk header lines.
/^diff --git/ {
    print
    next
}

{
    delete outs
    for (i=1; i<=NF; i++) {
        if ($i ~ /^[-+]/) {
            mode = substr($i, 1, 1)
            $i = ((mode=="-")?red:green) substr($i, 2) reset
            outs[mode] = outs[mode] $i reset
            outs["set" mode]++
        } else {
            gsub(/^ /, "", $i)
            outs["-"] = outs["-"] $i
            outs["+"] = outs["+"] $i
        }
    }

    # If we didn't have any changes then this is a context line and we need to
    # print it out.
    if (!outs["set-"] && !outs["set+"]) {
        print " " outs["-"]
        next
    }

    if (outs["set-"]) {
        print red "-" reset outs["-"]
    }

    if (outs["set+"]) {
        print green "+" reset outs["+"]
    }
}
Run Code Online (Sandbox Code Playgroud)

用作:

git diff --word-diff=porcelain | awk -v red="$(tput setaf 1)" -v green="$(tput setaf 2)" -v reset="$(tput sgr0)" -f worddiff.awk
Run Code Online (Sandbox Code Playgroud)

要么

git diff --word-diff-regex='([^[:alnum:]]|[^[:space:]])' --word-diff=porcelain | awk -v red="$(tput setaf 1)" -v green="$(tput setaf 2)" -v reset="$(tput sgr0)" -f worddiff.awk
Run Code Online (Sandbox Code Playgroud)

awk可能更干净,并且有一个非GNU awk split成语来清除一个我不记得的数组,如果delete a是一个问题.

编辑:更新上面的代码以匹配gist的最新版本.最初的特殊情况模式过于宽松.原始代码未正确处理添加的空行.鉴于已知的局限性,更新后的代码并不是最好的,但我认为这是最好的--word-diff=porcelain.