一组提交改过一轮以后,只看普通 diff 不太容易判断新旧提交怎么对应。git range-diff 会按补丁相似度配对两段提交,并把每个提交内部的变化单独列出来。
环境:Git 2.39+;Linux 或 macOS;Bash;需要 mktemp。下面只操作临时仓库:
set -eu
root=$(mktemp -d)
trap 'rm -rf -- "$root"' EXIT
repo="$root/demo"
git init -q -b main "$repo"
git -C "$repo" config user.name "Range Diff Demo"
git -C "$repo" config user.email "[email protected]"
printf 'limit=10\n' >"$repo/app.conf"
printf '# Demo\n' >"$repo/README.md"
git -C "$repo" add app.conf README.md
git -C "$repo" commit -qm base
git -C "$repo" switch -q -c series-v1
printf 'limit=20\n' >"$repo/app.conf"
git -C "$repo" commit -qam 'raise default limit'
printf '\nRun with the default settings.\n' >>"$repo/README.md"
git -C "$repo" commit -qam 'document default usage'
git -C "$repo" switch -q -c series-v2 main
git -C "$repo" cherry-pick series-v1~1
printf 'limit=25\n' >"$repo/app.conf"
git -C "$repo" commit -qam 'raise default limit' --amend
git -C "$repo" cherry-pick series-v1
git -C "$repo" range-diff main..series-v1 main..series-v2
输出里 ! 表示这对提交能对应上,但补丁内容变了;= 表示补丁没变。这里第一条提交会显示 limit=20 到 limit=25 的差异,第二条文档提交则保持一致。它很适合在 force-push 前后复查一组提交,也可以直接比较两个远端范围,例如 origin/main..origin/topic-v1 和 origin/main..origin/topic-v2。