Git:看单词级别改动,`git diff --word-diff` 有时更清楚

30 次浏览5 条回复

有些文档、README 或一行很长的配置改动,用普通 git diff 看起来整行都变了,其实只改了几个词。这个时候 --word-diff 会舒服一点。

环境:Git 2.30+。随便建个目录试:

mkdir git-word-diff-demo && cd git-word-diff-demo
git init
printf 'timeout is 1000 ms and retry is 2\n' > config.txt
git add config.txt
git commit -m 'init'

python - <<'PY'
from pathlib import Path
p = Path('config.txt')
s = p.read_text()
s = s.replace('1000', '2000').replace('retry is 2', 'retry is 3')
p.write_text(s)
PY

git diff --word-diff

输出里被删掉和新增的词会直接夹在行内,看这种小范围文字变化挺直观。

如果觉得默认标记不太顺眼,也可以试试:

git diff --word-diff=color

代码改动我一般还是看普通 diff,多行文本、说明文档、锁文件里某些短字段变化,才会想起这个。

这个看 README 改动确实舒服。补一个小点:如果默认按空白切词不够细,可以加 --word-diff-regex=. 让它按字符看,中文段落里会更直观一点。

git diff --word-diff=color --word-diff-regex=.

不过代码文件里慎用,信息会有点碎。

还可以顺手记一下 --color-words,它基本就是更紧凑的彩色 word diff:

git diff --color-words

看 release note 或 package 配置里某个版本号变化时挺清楚。就是终端主题颜色太淡的话,反而不如普通 diff 醒目。

还有个小习惯:如果只是想确认某个文件的文字改动,可以把路径也带上,别让整个仓库的 diff 混进来。

git diff --word-diff=color -- README.md

文档多的仓库里这个会清静不少。看完觉得还是太花,再切回普通 git diff -- README.md 就行。

如果要把结果贴到 issue 或聊天里,我觉得 plain 模式也挺实用,少一点终端颜色依赖:

git diff --word-diff=plain -- README.md

它会用 [-删掉-]{+新增+} 这种标记。缺点是原文里刚好有这些符号时会有点绕,所以我一般只拿来临时复制给别人看。

还有个容易混淆的点:--word-diff 只是展示方式变细了,不代表 Git 真的按“词”在判断文件有没有变。

如果一段文字被整体挪位置,输出还是可能看着很乱。那种情况我会先用:

git diff --stat

确认范围不大,再切到 word diff 看具体词。这样不太容易被一大屏行内标记绕晕。