我如何以最少的手动干预来教导“git-rerere”现有合并提交中的解决方案

Rei*_*l-- 5 git git-merge git-rerere

git-rerere是我遇到的问题的精确解决方案......除了需要“学习”的合并已经执行并且重复起来并不简单。

我如何rerere以最少的手动干预来“教授”这些提交。

假设现有但有冲突的分支AB被合并在一起以形成C已解决冲突的提交。然后我希望这样做:

  • git checkout A
  • git merge B
    • 当观察到冲突时合并暂停。
  • git reset --soft C
    • 工作文件现在处于所需的最终状态 - 即冲突已“解决”。
  • git merge --continue
    • rerere将更新的文件视为适当的分辨率,并“学习”此分辨率。

但该reset步骤不起作用:(

  • --soft合并期间不允许重置。
  • 重置--mixed核武器MERGE_HEAD(我假设通常会破坏 git 状态,这样合并就无法恢复)

编辑:

C通过预先检查并复制相关文件来手动“重置”文件是可行的,但由于存储库的庞大而复杂的性质,速度相当缓慢且乏味。

(很多项目位于单独的文件夹中,每个项目都有自己的 node_modules/packages 文件夹,这会消耗复制时间,除非我针对特定文件夹:( )

希望有一些自动化的东西。#乐观

phi*_*ilb 0

在 Git 2.36 及更高版本中,您可以用来git show --remerge-diff创建差异,显示合并是如何解决的。通过一些技巧,这可以用来做你想做的事情。

  1. 首先,我们重新创建合并冲突,但使用可预测的冲突标记。失败后git merge B,您可以运行:

    git checkout --merge :/
    
    Run Code Online (Sandbox Code Playgroud)

    这将重新创建合并冲突,但在合并冲突标记行上使用ours和。使用顶部路径规范theirs( ) ,因此这可以在存储库中的任何目录中运行。:/

  2. 然后我们使用git show --remerge-diff,将其输出传递给sed也使用ourstheirs作为冲突标记,最后应用此差异:

    git show --format= --remerge-diff C | \
    sed -e 's/<<<<<<< .*/<<<<<<< ours/g' -e 's/>>>>>>> .*/>>>>>>> theirs/g' | \
    git apply
    
    Run Code Online (Sandbox Code Playgroud)

请注意,与 rerere 相比,此方法还允许您重新应用在冲突区域之外的合并中所做的任何更改。