问题背景

git diff 默认以行为单位对比,两类常见痛点:

  1. 行尾空格噪音:格式化工具、编辑器自动去除行尾空格,导致 diff 输出大量无意义的空白变更,掩盖真实改动
  2. 长行改动难读:Markdown、文档、配置文件中一行很长,改了几个词却显示整行删除/新增,难以定位具体变化

--ignore-space-at-eol:忽略行尾空白

解决的问题

只忽略行尾的空白字符差异,保留行中间的空白变化。

适用场景:

  • 编辑器/格式化工具自动去除行尾空格,产生大量无意义 diff
  • 跨平台协作(Windows CRLF vs Unix LF 的行尾差异)
  • 审查 Markdown/文档时过滤格式噪音

用法

git diff --ignore-space-at-eol
git diff --ignore-space-at-eol SKILL.md

空白忽略选项对比

选项别名忽略范围
--ignore-space-at-eol—仅行尾空白
-b--ignore-space-change行尾空白 + 连续空白视为等价
-w--ignore-all-space所有空白字符(包括行中间)
--ignore-blank-lines—忽略空行变化

推荐优先用 --ignore-space-at-eol,比 -w 更精准,不会误忽略有意义的缩进变化。


--word-diff:单词级差异

解决的问题

将 diff 粒度从”行”细化到”单词”,一行中只有几个词变化时,直接高亮变化的词,而不是显示整行删除/新增。

适用场景:

  • Markdown、文档、注释的修改审查
  • 配置文件中值的变更
  • 长行代码中局部变量/字符串修改
  • SKILL.md 等 prompt 文件的迭代对比

用法

git diff --word-diff SKILL.md
git diff --word-diff=color SKILL.md
git diff --word-diff=plain SKILL.md

四种模式

模式命令输出格式适用场景
plain(默认)--word-diff[-removed-] {+added+}终端无色彩时,文本标记清晰
color--word-diff=color颜色高亮,无标记符号支持颜色的终端,最直观
porcelain--word-diff=porcelain脚本友好的行格式,~ 表示换行脚本解析、自动化处理
none--word-diff=none禁用 word diff取消之前的 word-diff 设置

示例输出(plain 模式)

原文:The quick brown fox 改后:The fast brown fox

The [-quick-]{+fast+} brown fox

自定义单词分隔符

默认以空格分词,可用 --word-diff-regex 自定义:

# 以非字母数字字符分词(适合代码)
git diff --word-diff --word-diff-regex='[^[:space:]]+'
 
# 以字符为单位对比(最细粒度)
git diff --word-diff --word-diff-regex='.'

组合使用

# 忽略行尾空白 + 单词级对比(文档审查最佳组合)
git diff --ignore-space-at-eol --word-diff SKILL.md
 
# 彩色单词级对比
git diff --word-diff=color --ignore-space-at-eol SKILL.md

持久化配置

# 全局默认开启 word-diff
git config --global diff.wordRegex '[^[:space:]]+'
 
# 对特定文件类型启用(.gitattributes)
*.md diff=markdown

相关页面