不需要再次解决合并冲突的情况下使用git reword

18

能否使用 git rebase 更改提交消息,但不必重新解决合并冲突?

我需要修改一个较旧的 repo,并且不想更改任何实际代码,只需更改消息。

我尝试过 --preserve-merges

2个回答

20

Git有一个鲜为人知的功能叫做“重用已记录的决策”,或者rerere

您可以运行git config --global rerere.enabled true来全局启用它。

如果启用了rereregit会自动保存冲突解决方案,并在以后遇到相同的冲突时重复使用这些解决方案。这意味着用户不需要重新解决这些先前看到的冲突。

这个功能在这里得到了解释 - Git-Rerere

git rerere命令的文档在这里 - git-rerere(1)


7
很遗憾,如果您在最初合并时启用了这个功能,它将会对您有所帮助,但现在已经太晚了。Git的源代码中有一个名为"rerere-train"的脚本(链接在此:https://github.com/gitster/git/blob/master/contrib/rerere-train.sh),它可以遍历现有历史记录,并让rerere从现有合并中学习冲突解决方案。假如它起作用,那么这将对您有所帮助。 - Cascabel

12
注意:由于 contrib/rerere-train.sh 脚本旨在重新训练 rerere(可以查看手动重新训练),为了确保 rerere 忘记所有当前的变基解决方案,现在你有一个正式选项,在 Git 2.14.x/2.15(Q3 2017)中使用 contrib/rerere-train--overwrite 标志。
参见 提交 ad53bf7 (由 Raman Gupta (rocketraman) 在 2017 年 7 月 26 日提交。
(由 Junio C Hamano -- gitster -- 合并于 提交 aec68c3,于 2017 年 8 月 11 日合并)

contrib/rerere-train:可选择覆盖现有的解决方案

通过使用 --overwrite 标志向用户提供覆盖现有解决方案的选项。

例如,如果用户知道他们的 rerere 缓存中已经有一个冲突条目,但希望删除它并重新基于传递给 rerere-train 脚本的合并提交进行训练,则可以使用此选项。


我们如何称呼rerere-train?我们应该创建一个新文件,然后运行脚本吗? - otong
1
@omg,你可以在https://dev59.com/nW855IYBdhLWcg3wxHYq#42416725中看到调用[该脚本](https://github.com/git/git/blob/master/contrib/rerere-train.sh)的示例。 - VonC
这对于 cherry-pick 也有效吗?看起来不是这样的,因为它似乎完全跳过非合并。 - Vegard
这对于挑选特定提交是否适用呢?从链接的源代码来看,似乎并不适用(它似乎完全跳过非合并提交)。 - Vegard
@Vegard 我没有测试过,但我怀疑它是否适用于挑选樱桃。 - VonC
@Vegard 我没有测试过,但我怀疑它确实无法用于挑选樱桃。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接