35

据我了解,通过保存冲突解决信息对项目同步很有用,但我并不完全清楚如何使用和配置它。

我想为我的持续集成 (CI) 环境进行配置。是否建议这样做?

请不要用另一个问题标记重复:启用 git rerere 有什么缺点吗?. 因为我的怀疑与“那么启用 rerere 有什么缺点吗?它会导致哪些潜在问题不会发生?”

4

2 回答 2

56

是什么git rerere

文档所述rerere代表重新使用记录的重新解决方案。

不过,这并不能真正解释它是什么。值得首先在这里添加,它git rerere本身——命令——不是你必须运行的东西。它只有六个子命令:clearforgetdiffstatusremaininggc。这些都没有记录或重用决议——事实上,git rerere clear只是git rerere forget <path>丢弃一些记录的决议。该gc命令类似,但指的是旧的,而不是当前的。

大部分工作发生在(这使得 Git在适当的时间运行,没有子命令,为你)的设置您可以自己不使用子命令运行,但这并没有真正做任何重要的事情,因为 Git 会自己做。rerere.enabledgit rereregit rerere

git config rerere.enabled true

一旦你设置rerere.enabled了 ,当 Git 进行合并时——任何合并,包括来自git amandgit rebase等的合并,git cherry-pick而不仅仅是来自git merge自身的合并——并且遇到冲突,Git 将:

  1. 记录(一旦merge-as-a-verb击中它们)冲突的差异大块;
  2. 等你手动解决;
  3. git commit有时)记录您为解决这些问题所做的工作。

这里缺少一个步骤,这就是为什么它从 2 开始编号。第 1 步是:

  1. 检查以前记录的这些冲突的解决方案:如果它们存在,请使用它们自动解决这些冲突。

如果记录的解决方案完全解决了冲突,则步骤 2-4 变得多余。Git 可能仍会全部运行它们(我不确定它是否会运行)以更新记录分辨率的时间戳。

概括

一旦你设置rerere.enabled了 ,它就是合并自身的行为,它既会产生冲突又会(因为它会在git rerere没有参数的情况下自动运行)记录它们,然后尝试重新使用任何现有的记录解决方案。记录最终解决方案的是提交自己的行为(因为 Git 会自动git rerere再次为您运行)。所以这一切都是自动的——你只需要通过运行你自己的git diff命令来确保你以前重复使用的分辨率是正确的。如果没有,只需像往常一样修复文件、添加和提交,Git 就会用新的解决方案替换记录的解决方案。

请注意,您必须仍然git addgit commit!您应该始终检查合并结果(和/或运行测试)——尽管您应该始终这样做,无论您的rerere.enabled设置如何。

正如VonC 在评论中指出的那样,如果您有之前没有记录的现有合并冲突解决方案,您可以在这些解决方案上“训练”rerere 数据库。 Git 源代码中有一个贡献的脚本来执行此操作;它也可以在线获得。

于 2018-03-26T22:10:16.053 回答
7

为您的 CI 环境启用是没有意义的rerere,因为您的 CI 环境从一开始就不应该解决合并冲突。为什么你认为你会想要它?

于 2019-03-19T04:25:24.183 回答