我已经阅读了关于git的rerere
功能的各种信息,正在考虑启用它。
git rerere
功能是一个有点隐藏的特性。名称代表“reuse recorded resolution”,正如名称所示,它允许您要求Git记住您如何解决冲突,以便下次遇到相同的冲突时,Git可以自动解决它。
但我没有看到任何人提到使用rerere
可能出现的问题。
我必须假设存在缺点,否则它可能已默认启用。因此,启用rerere会有什么缺点?它可能引起哪些不会发生的潜在问题?
我已经阅读了关于git的rerere
功能的各种信息,正在考虑启用它。
git rerere
功能是一个有点隐藏的特性。名称代表“reuse recorded resolution”,正如名称所示,它允许您要求Git记住您如何解决冲突,以便下次遇到相同的冲突时,Git可以自动解决它。
但我没有看到任何人提到使用rerere
可能出现的问题。
我必须假设存在缺点,否则它可能已默认启用。因此,启用rerere会有什么缺点?它可能引起哪些不会发生的潜在问题?
rerere
会把有冲突的文件标记为未合并,这样你就必须要手动添加它们(希望在检查/测试后),然后再提交。如果需要的话,你可以始终使用 git checkout -m <path>
命令来检出原始的有冲突的版本并重新解决冲突。 - Cascabel正如 J. C. Hamano 在他的文章 "Fun with rerere"(我加粗了)中所提到的:
- Rerere 记住了您选择解决冲突区域的方式;
- Rerere 还记得您在冲突区域之外进行的语义更改调整;
- Rerere 可以重用先前的解决方案,即使您正在合并两个与您早期解决的内容不同的分支。
即使使用 rerere 很长时间的人也经常忽略最后一点。
因此,如果您在内容上激活了 rerere
,由于最后一点,您可能会得到令人惊讶或困惑的合并解决方案。
commit.gpgSign
时,rerere
会要求你输入GPG签名的PIN码。git rerere gc
可以忘记旧的解决方案。时间范围越短,误击的概率就越小。 - gavenkoa我已经全局启用了rerere。实际上,我没有注意到任何问题,通常它似乎使我的生活更加轻松。
我在gitk中挑选了一个只包含二进制文件的提交。由于冲突,cherrypick失败了(想想也是很自然的)。我解决了冲突并保留了cherry pick。后来我惊讶地发现,在另一个已经rebase的分支中,我的dll文件没有正常工作——后来我发现它们没有被带入rebase中(我猜测是因为自动冲突解决)。所以这是我遇到的唯一一种情况(启用rerere),遇到了直觉上不符合预期(尽管我确定是完全一致的)的行为。
git rerere forget path/to/compiled/bin.dll
- Mr_and_Mrs_Da
:const foo = [
'line 1',
'line 2',
'line 3',
];
// ...
const str = foo.join("\n");
新文件 b
:
const foo = [
'line 1',
'line 2',
'line 3',
];
a
:// ...
const str = b.foo.join("\n")
在另一个分支中将a
更改为:
const foo = [
'line 1',
'line 2',
'new line',
'line 3',
];
// ...
const str = foo.join("\n");
解决方案保留了文件a
中重构后的内容,并将新行添加到文件b
中。然而,请注意,Rerere只会重新应用解决方案到文件a
,因为在初始解决方案过程中它遇到了冲突,而文件b
则没有遇到任何冲突。
Resolved 'index.html' using previous resolution.
。 - user82216