是,rerere在变基中断时仍生效;只要全局启用(git config --global rerere.enabled true),git会在冲突发生时自动匹配并应用此前记录的相同冲突解决方案,缓存保存于.git/rr-cache中,不受rebase --abort影响。

变基中断时 rerere 是否生效?
只有在 git config --global rerere.enabled true 已启用的前提下,rerere 才会在变基(git rebase)过程中捕获并复用冲突解决方案。它不依赖于你是否手动运行 git rerere 命令——只要冲突发生且此前记录过相同 preimage,Git 就会自动尝试应用缓存的解决方式。
常见误判是:看到变基停在冲突处,就以为 rerere 没起作用。其实它可能已经悄悄应用了部分解决,只是剩余差异仍需人工介入。你可以用 git rerere status 查看当前哪些文件被识别为“已知冲突”;若输出为空,说明该冲突模式从未被记录过。
rerere 缓存怎么生成?必须手动提交吗?
不需要手动提交。rerere 的缓存生成发生在你完成一次冲突解决并执行 git add 之后——Git 会自动记录该文件的 preimage(合并前内容)、postimage(解决后内容)和 conflict hunk 结构。下一次遇到完全相同的三元组(相同文件 + 相同冲突行范围 + 相同上下文),它才会触发自动应用。
注意几个关键点:
- 空白字符变化(如 DOS/Unix 换行符、缩进空格)会影响 preimage hash,导致缓存不命中
- 如果冲突块中某一行被新增或删减,哪怕只差一个字符,rerere 就不会复用
-
git rerere forget <file></file>可清除单个文件缓存,用于调试或强制重录
rebase --abort 后 rerere 缓存还在吗?
在,而且仍然有效。rerere 缓存存储在 .git/rr-cache/ 目录下,与工作区状态、暂存区、甚至当前分支指针无关。即使你执行 git rebase --abort 或 git reset --hard,只要没删掉 .git/rr-cache,之前记录的解决方案就还在。
这意味着你可以安全地中断变基、修复其他问题、再重新 git rebase,rerere 仍会尝试复用旧方案。但要注意:
- 如果原始冲突文件在两次变基之间被修改过(比如其他人 push 了新提交),preimage 可能已失效
- rerere 不校验 commit ID 或 parent 关系,只比对文件内容快照
- 缓存不会过期,但长期不用的记录可手动清理:
rm -rf .git/rr-cache/*
为什么有时 rerere 明明启用了却没自动解决?
最常被忽略的是「冲突上下文不一致」。rerere 不仅匹配冲突块本身,还检查前后几行的非冲突内容(即 context lines)。哪怕你只改了冲突块上方一行注释,或删了一个空行,hash 就变了。
排查建议:
- 用
git show :1:<file></file>和git show :3:<file></file>分别查看 base 和 theirs 版本,对比实际 diff 区域 - 运行
git rerere diff(需先git rerere)查看当前冲突与缓存记录的差异位置 - 确认你解决冲突时没有意外引入额外改动(比如格式化整段代码),这会导致 postimage 不匹配
rerere 的设计目标不是“万能自动解决”,而是“避免重复劳动”。它只在你真正在同一处反复撞墙时才显出价值——而那恰恰是变基中最让人烦躁的部分。











