Rei*_*l-- 5 git git-merge git-rerere
git-rerere是我遇到的问题的精确解决方案......除了需要“学习”的合并已经执行并且重复起来并不简单。
我如何rerere以最少的手动干预来“教授”这些提交。
假设现有但有冲突的分支A和B被合并在一起以形成C已解决冲突的提交。然后我希望这样做:
git checkout Agit merge B
git reset --soft C
git merge --continue
rerere将更新的文件视为适当的分辨率,并“学习”此分辨率。但该reset步骤不起作用:(
--soft合并期间不允许重置。--mixed核武器MERGE_HEAD(我假设通常会破坏 git 状态,这样合并就无法恢复)编辑:
C通过预先检查并复制相关文件来手动“重置”文件是可行的,但由于存储库的庞大而复杂的性质,速度相当缓慢且乏味。
(很多项目位于单独的文件夹中,每个项目都有自己的 node_modules/packages 文件夹,这会消耗复制时间,除非我针对特定文件夹:( )
我希望有一些自动化的东西。#乐观
在 Git 2.36 及更高版本中,您可以用来git show --remerge-diff创建差异,显示合并是如何解决的。通过一些技巧,这可以用来做你想做的事情。
首先,我们重新创建合并冲突,但使用可预测的冲突标记。失败后git merge B,您可以运行:
git checkout --merge :/
Run Code Online (Sandbox Code Playgroud)
这将重新创建合并冲突,但在合并冲突标记行上使用ours和。使用顶部路径规范theirs( ) ,因此这可以在存储库中的任何目录中运行。:/
然后我们使用git show --remerge-diff,将其输出传递给sed也使用ours和theirs作为冲突标记,最后应用此差异:
git show --format= --remerge-diff C | \
sed -e 's/<<<<<<< .*/<<<<<<< ours/g' -e 's/>>>>>>> .*/>>>>>>> theirs/g' | \
git apply
Run Code Online (Sandbox Code Playgroud)
请注意,与 rerere 相比,此方法还允许您重新应用在冲突区域之外的合并中所做的任何更改。