在预处理分支后重新应用合并?

Re-apply merge, after preprocessing the branches?

我经常遇到这样的情况,其中 git merge 包含很多冲突,可以通过更改其中一个分支以更紧密地匹配另一个分支来轻松自动解决。可悲的是,我经常在手动解决数十个冲突后才注意到这些模式,这确实需要手动审查;中止提交以应用脚本将意味着重做这些。

是否有可能从合并返回到分支,而不放弃投入到手动解决冲突的工作?


没有这种可能性,是否可以在冲突文件上 运行 脚本,然后 "auto-resolve" 冲突,现在两个版本相同?例如,假设某些文件包含许多格式为

的冲突
<<<<<<< HEAD
aaaaaaaa \todo{bbbbbbbb} cccccccc
=======
aaaaaaaa \TODO{bbbbbbbb} cccccccc
>>>>>>> other

通过 运行 在受影响的文件中使用 sed 单行代码可以很容易地解决这些冲突,但我不知道有什么工具可以删除 `< <<<<< ======= >>>>>>>”标记。


通常导致此类问题的工作流程都是非标准情况,例如:

是:使用rererere使用recorded re解决方案.

如果你这样做 git config rerere.enabled true 你打开它的 ~auto~ 模式,当合并因冲突而停止时它会自动 运行s 并且当你提交结果时再次。

即使在你不打算承诺的情况下,这也会很方便,因为你可以到达你正在谈论的地方,在那里你已经做了很多决议并意识到你几乎可以避免其余的都进行了一些预处理,然后在中止合并之前手动执行 git rerere

当重新 运行 时,它 (a) 记住新的冲突和新的解决方案,并且 (b) 将记住的解决方案应用于它以前见过的冲突。所以在你的情况下,打开自动模式(我认为这在关注它的人中几乎是普遍的)它会注意到所有的冲突并重新应用你之前展示过的任何解决方案,所以当你到达点你已经完成了所有你能做的,即将返回并再次尝试使用你手动 运行 git rerere 预处理的数据,它会看到你提出的任何新解决方案并忽略剩余的冲突,因为它以前见过那些,但对他们没有任何帮助。然后中止合并,进行预处理,重新运行 合并和 auto rerere 都将解决它可以识别的任何冲突并注意到任何新的冲突。

准备好,但是,Git 无法识别两个文本不同的大块头在语义上是相同的,所以如果你的 prettyprinter 分割线等等,那么即使你解决了旧文本中的语义冲突 Git 无法在新文本中构建类似的文本更改。