在预处理分支后重新应用合并?
Re-apply merge, after preprocessing the branches?
我经常遇到这样的情况,其中 git merge
包含很多冲突,可以通过更改其中一个分支以更紧密地匹配另一个分支来轻松自动解决。可悲的是,我经常在手动解决数十个冲突后才注意到这些模式,这确实需要手动审查;中止提交以应用脚本将意味着重做这些。
是否有可能从合并返回到分支,而不放弃投入到手动解决冲突的工作?
没有这种可能性,是否可以在冲突文件上 运行 脚本,然后 "auto-resolve" 冲突,现在两个版本相同?例如,假设某些文件包含许多格式为
的冲突
<<<<<<< HEAD
aaaaaaaa \todo{bbbbbbbb} cccccccc
=======
aaaaaaaa \TODO{bbbbbbbb} cccccccc
>>>>>>> other
通过 运行 在受影响的文件中使用 sed
单行代码可以很容易地解决这些冲突,但我不知道有什么工具可以删除 `< <<<<< ======= >>>>>>>”标记。
通常导致此类问题的工作流程都是非标准情况,例如:
收到一个 ZIP 文件形式的实验修改快照,稍后需要将我的更改合并到存储库中。
相反的情况,我想将仅作为快照可用的第三方更改合并到我的源中,而不知道共同的祖先状态:在爱好者游戏改装方面有经验,这导致数百行仅 {sir/madam}
变为 {reg33?sir:madam}
不同。
通过从程序导出在两个分支上独立创建的文件。不同的工作流程导致 几乎 相同的状态,除了 \todo[inline]
与 \todoinline
等细微差异外,这些差异在解决合并冲突时淹没了实际相关的差异。
一些文件可能已经在一个分支上进行了漂亮打印,如果在合并之前在另一个分支上也应用了漂亮打印,那么会产生很多冲突,这些冲突将会消失。
是:使用rerere、re使用recorded re解决方案.
如果你这样做 git config rerere.enabled true
你打开它的 ~auto~ 模式,当合并因冲突而停止时它会自动 运行s 并且当你提交结果时再次。
即使在你不打算承诺的情况下,这也会很方便,因为你可以到达你正在谈论的地方,在那里你已经做了很多决议并意识到你几乎可以避免其余的都进行了一些预处理,然后在中止合并之前手动执行 git rerere
。
当重新 运行 时,它 (a) 记住新的冲突和新的解决方案,并且 (b) 将记住的解决方案应用于它以前见过的冲突。所以在你的情况下,打开自动模式(我认为这在关注它的人中几乎是普遍的)它会注意到所有的冲突并重新应用你之前展示过的任何解决方案,所以当你到达点你已经完成了所有你能做的,即将返回并再次尝试使用你手动 运行 git rerere
预处理的数据,它会看到你提出的任何新解决方案并忽略剩余的冲突,因为它以前见过那些,但对他们没有任何帮助。然后中止合并,进行预处理,重新运行 合并和 auto rerere 都将解决它可以识别的任何冲突并注意到任何新的冲突。
准备好,但是,Git 无法识别两个文本不同的大块头在语义上是相同的,所以如果你的 prettyprinter 分割线等等,那么即使你解决了旧文本中的语义冲突 Git 无法在新文本中构建类似的文本更改。
我经常遇到这样的情况,其中 git merge
包含很多冲突,可以通过更改其中一个分支以更紧密地匹配另一个分支来轻松自动解决。可悲的是,我经常在手动解决数十个冲突后才注意到这些模式,这确实需要手动审查;中止提交以应用脚本将意味着重做这些。
是否有可能从合并返回到分支,而不放弃投入到手动解决冲突的工作?
没有这种可能性,是否可以在冲突文件上 运行 脚本,然后 "auto-resolve" 冲突,现在两个版本相同?例如,假设某些文件包含许多格式为
的冲突<<<<<<< HEAD
aaaaaaaa \todo{bbbbbbbb} cccccccc
=======
aaaaaaaa \TODO{bbbbbbbb} cccccccc
>>>>>>> other
通过 运行 在受影响的文件中使用 sed
单行代码可以很容易地解决这些冲突,但我不知道有什么工具可以删除 `< <<<<< ======= >>>>>>>”标记。
通常导致此类问题的工作流程都是非标准情况,例如:
收到一个 ZIP 文件形式的实验修改快照,稍后需要将我的更改合并到存储库中。
相反的情况,我想将仅作为快照可用的第三方更改合并到我的源中,而不知道共同的祖先状态:在爱好者游戏改装方面有经验,这导致数百行仅
{sir/madam}
变为{reg33?sir:madam}
不同。通过从程序导出在两个分支上独立创建的文件。不同的工作流程导致 几乎 相同的状态,除了
\todo[inline]
与\todoinline
等细微差异外,这些差异在解决合并冲突时淹没了实际相关的差异。一些文件可能已经在一个分支上进行了漂亮打印,如果在合并之前在另一个分支上也应用了漂亮打印,那么会产生很多冲突,这些冲突将会消失。
是:使用rerere、re使用recorded re解决方案.
如果你这样做 git config rerere.enabled true
你打开它的 ~auto~ 模式,当合并因冲突而停止时它会自动 运行s 并且当你提交结果时再次。
即使在你不打算承诺的情况下,这也会很方便,因为你可以到达你正在谈论的地方,在那里你已经做了很多决议并意识到你几乎可以避免其余的都进行了一些预处理,然后在中止合并之前手动执行 git rerere
。
当重新 运行 时,它 (a) 记住新的冲突和新的解决方案,并且 (b) 将记住的解决方案应用于它以前见过的冲突。所以在你的情况下,打开自动模式(我认为这在关注它的人中几乎是普遍的)它会注意到所有的冲突并重新应用你之前展示过的任何解决方案,所以当你到达点你已经完成了所有你能做的,即将返回并再次尝试使用你手动 运行 git rerere
预处理的数据,它会看到你提出的任何新解决方案并忽略剩余的冲突,因为它以前见过那些,但对他们没有任何帮助。然后中止合并,进行预处理,重新运行 合并和 auto rerere 都将解决它可以识别的任何冲突并注意到任何新的冲突。
准备好,但是,Git 无法识别两个文本不同的大块头在语义上是相同的,所以如果你的 prettyprinter 分割线等等,那么即使你解决了旧文本中的语义冲突 Git 无法在新文本中构建类似的文本更改。