git-rerere是什么、工作原理及CI环境配置建议咨询
嘿,我来帮你把git-rerere的使用、配置,还有CI环境下的适配问题理清楚~
一、先搞懂git-rerere:基础用法与配置
git-rerere(全称reuse recorded resolution)说白了就是帮你记住「上次怎么解决某个冲突的」,下次再碰到一模一样的冲突时,自动帮你套用之前的解决方案,省得重复手动改。
1. 启用方式
你可以选全局启用(所有仓库都生效)或者单个仓库启用:
- 全局启用:在终端执行
git config --global rerere.enabled true - 单个仓库启用:先进入目标仓库目录,再执行
git config rerere.enabled true
启用之后不用额外操作,当你解决完冲突并提交代码时,git会自动把这次的冲突解决方案记录下来,存在仓库的.git/rr-cache目录里。
2. 常用辅助命令
- 查看当前正在跟踪的冲突:
git rerere status - 查看已记录的解决方案和当前冲突的差异:
git rerere diff - 清空所有已记录的解决方案:
git rerere clear(适合清理过时的旧记录)
二、CI环境下是否推荐配置git-rerere?
这个得看你的CI场景,不能一概而论,给你分情况说:
👉 非常推荐的场景
如果你的CI流水线经常碰到重复、可预测的固定冲突,那rerere绝对能帮你省大事:
- 比如团队里频繁把dev分支合并到main,或者多个feature分支合回dev时,总会出现相同的冲突(比如某个配置文件、公共工具类的修改冲突)
- 或者CI是自动执行合并/重基操作(比如自动同步依赖分支到测试分支),重复冲突会导致CI失败,需要人工介入,这时候rerere能自动解决,提升流水线的稳定性和速度
👉 需要谨慎的场景
如果你的冲突是不可预测的、需要人工判断的,那最好别在CI里开rerere:
- 比如业务逻辑大改导致的新冲突,rerere会盲目套用旧的解决方案,很可能引入隐藏的bug,这时候CI应该直接失败,让开发人员手动处理才安全
- 另外,如果你的CI环境是完全无状态的(比如每次都拉取全新的代码镜像,没有持久化存储),那rerere的缓存(
.git/rr-cache)会在每次CI结束后丢失,下次碰到冲突还是没法自动解决,这种情况要么得把缓存目录持久化,要么开了也没用
👉 如果决定在CI里启用,这么配置
以常见的CI脚本为例,步骤大概是这样:
- 在CI脚本开头先启用rerere:
# 进入代码目录后执行 git config rerere.enabled true - 持久化缓存(关键!不然每次CI都是全新环境,记录白存):
比如在GitHub Actions里,可以用缓存动作把.git/rr-cache目录存起来,下次CI运行时再加载:- name: Cache rerere cache uses: actions/cache@v3 with: path: .git/rr-cache key: ${{ runner.os }}-rerere-${{ github.sha }} restore-keys: | ${{ runner.os }}-rerere- - 验证效果:先手动解决一次冲突并提交,让rerere记录解决方案,然后触发CI执行同样的合并/重基操作,看是否能自动解决冲突
三、最后提个小提醒
即使开了rerere,也别忘了定期清理过时的解决方案——毕竟代码一直在变,旧的解决方案可能已经不适用了,用git rerere clear就能清空所有记录,或者直接删除.git/rr-cache里的单个文件。
内容的提问来源于stack exchange,提问作者Carlos Laspina
相关产品推荐
相关产品推荐

