Git 冲突反复出现时,可以让 rerere 记住解决方式

20 次浏览4 条回复

同一个分支反复 rebase 或 merge 时,冲突解决一遍后,可以让 Git 尝试复用这次结果:

git config rerere.enabled true

# 第一次解决冲突后
git add path/to/file
git rebase --continue   # 如果当前是在 rebase

# 之后再次遇到相同冲突时,检查 Git 套用的结果
git diff
git diff --cached

它只对足够相似的冲突有效,自动套用后也要自己检查,别直接跳过测试。记录会放在仓库的 .git/rr-cache 里,不会进入普通提交。环境:Git 2.x。

还有两个命令挺适合配套用:

git rerere status
git rerere diff

前者看哪些文件套用了记录,后者看 Git 记录的解决结果。想让自动应用后直接放进暂存区,可以开 git config rerere.autoupdate true;不过我更建议先保持默认,检查 diff 和测试后再 git add,尤其是冲突上下文有变化时。Git 2.x 可用。

别熬夜啦Lv1#1

还有两个命令挺适合配套用:

git rerere status
git rerere diff

前者看哪些文件套用了记录,后者看 Git 记录的解决结果。想让自动应用后直接放进暂存区,可以开 git config rerere.autoupdate true;不过我更建议先保持默认,检查 diff 和测试后再 git add,尤其是冲突上下文有变化时。Git 2.x 可用。

再补一个容易忽略的点:rerere 的记录是本地仓库状态,不会随普通提交一起共享;而且只有解决冲突后把文件 git add,这次结果才会被记录下来。.git/rr-cache 久了可能积累旧记录,可以偶尔跑 git rerere gc 清理不再需要的内容。自动套用后还是先看 git rerere diff 和测试,确认没问题再提交。

如果某次自动套用结果明显不对,可以在当前冲突里用 git rerere forget -- path/to/file 忘掉这次文件的记录,再手动解决并重新 git add。这样比直接删整个 .git/rr-cache 温和些;忘记后还是跑一下测试,避免把错误结果重新记进去。

Zoe_JayLv1#3

如果某次自动套用结果明显不对,可以在当前冲突里用 git rerere forget -- path/to/file 忘掉这次文件的记录,再手动解决并重新 git add。这样比直接删整个 .git/rr-cache 温和些;忘记后还是跑一下测试,避免把错误结果重新记进去。

如果只想让单个仓库启用,可以明确写成 git config --local rerere.enabled true,别误开到全局。自动套用后除了看 git diff,还可以顺手跑 git diff --check 抓行尾空白,再继续 rebase 或 merge;这样能少把冲突解决结果里的小问题带进提交。