什么是git-rerere以及它是如何工作的?

Car*_*ina 8 git version-control continuous-integration git-rerere

据我所知,通过保存冲突解决信息来实现项目同步非常有用,但我并不完全清楚如何使用和配置它.

我想配置我的持续集成(CI)环境.建议这样做吗?

请不要在另一个问题上标记副本:启用git rerere是否有任何缺点?.因为我的怀疑与"因此是否有任何不利因素"无关?它会导致哪些潜在的问题不会发生呢?

tor*_*rek 21

什么是git rerere

由于该文件指出,rerere代表使用有绳解决方案.

但这并没有真正解释它是什么.值得首先添加,这里,它git rerere本身 - 命令 - 不是你必须运行的东西.它只有六子:clear,forget,diff,status,remaining,和gc.这些记录中没有或重用分辨率可实际上,git rerere cleargit rerere forget <path>刚刚放弃一些记录分辨率.该gc命令是相似的,而是指那些都老了,而不是目前的.

大多数工作都是在设置的情况下进行rerere.enabled(这使得Git git rerere在适当的时间运行,没有子命令).你可以git rerere自己运行没有子命令,但这并没有真正做任何重要的事情,因为Git会自己做.

git config rerere.enabled true

一旦设置rerere.enabled,当混帐做了合并,合并的任何,包括那些来自git amgit rebasegit cherry-pick等等,而不仅仅是那些从git merge自身和撞击发生冲突,Git会:

  1. 记录(一旦合并为动词击中他们)冲突的差异;
  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源代码中有一个贡献的脚本来执行此操作; 它也可以在线获得.

  • “一旦您设置了`rerere.enabled`'...”,是的,但是不要忘记,您可以在*过去*尚未启用时完成*过去*的冲突解决方案上训练rerere。手动(/sf/answers/290866621/)或通过`contrib / rerere-train.sh`脚本(/sf/answers/3196530011/​​/6309) (2认同)

Mar*_*ser 6

rerere为您的 CI 环境启用是没有意义的,因为您的 CI 环境不应该首先解决合并冲突。为什么你认为你会想要它在那里?