对 git 中的差异进行着色

对 git 中的差异进行着色

设置

我编写了一个脚本,通过在合并之前和之后显示差异的差异来检查合并提交是否已成功解决。例如,如果我的历史记录如下所示:

* 5c8cb0d2 merge result
|\
| * 3685c2ea branch2 commit b
| * 556dcd25 branch2 commit a
* | bb72182a branch1 commit
|/
* 45d827a3 common ancestor

45d827a3 common ancestor我首先对to进行比较bb72182a branch1 commit(对branch1 进行原始更改),然后对3685c2ea branch2 commit bto进行比较5c8cb0d2 merge result(显示branch2 如何被branch1“丰富”)。

理想情况下,这两个差异应该是相同的,但如果存在冲突(比如分支 2 重命名了分支 1 使用的函数),我需要在合并提交中解决它。为了验证合并提交是否正确解决了这些问题并且没有意外搞乱某些东西,我对这两个差异进行了差异

问题

生成的差异的颜色不是很好。例如,如果我不小心删除了分支 2 中添加的行,它们将显示为绿色,因为原始 diff 不包含这些行,但新 diff 包含这些行。简而言之,我需要根据行的开头应用下表:

  • ++= 绿色(该行是由新 diff 添加的,但在旧 diff 中未更改)
  • +-= 红色(该行在新 diff 中被删除,但在旧 diff 中未更改)
  • -+= 红色(该行在新 diff 中未更改,但在旧 diff 中添加)
  • --= 绿色(该行在新 diff 中未更改,但在旧 diff 中已删除)
  • += 白色(仅限新上下文行)
  • -= 白色(仅限旧上下文行)

部分解决方案

我能够通过使用 来实现一条规则sed,但我不知道如何一次应用所有规则。例如,实施规则-+

git diff ... | { esc=$(printf '\033'); sed -E "s/(^\-\+.*)/${esc}[0;31m\1${esc}[0m/"; }

相关内容