是否可以仅显示旧线和新线之间的差异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
.