这就是我在评论中提到的rerere-train.sh脚本的作用——本质上它会重做合并,使用您的分辨率,然后让 rerere 看到它。如果您愿意,您可以为您的单个提交手动执行此操作:
git checkout <parent of merge commit>
git merge <merged commit> # if this goes cleanly, we're done
git rerere # done automatically if rerere.enabled is true
git checkout <merge commit> -- . # check out the files from the result of the merge
git rerere # done automatically if rerere.enabled is true
git reset --hard # wipe away the merge
# and you'd want to follow with git checkout <branch> to return to where you were
但是您也可以设置rerere.enabled
为 true,并执行这些步骤减去直接调用git rerere
— 并且您将在未来设置,只要您解决冲突,就会自动运行 rerere。这就是我所做的——太棒了。
如果您想直接运行脚本,您可能需要使用rerere-train.sh ^<commit before the merge> <current branch>
. (这个^commit
符号的意思是“不要从这里进入历史”,所以它不会为你的 repo 中的所有合并提交而烦恼。)
无论您如何做它的事情,您应该最终记录所需的分辨率。这意味着你可以继续做你的rebase -i
,当你遇到冲突时,rerere 将重新使用记录的解决方案。提醒一下:它仍然在索引中留下标记为冲突的文件,以便您可以检查它们并确保它所做的事情是有意义的。完成后,请使用git add
检查它们,就好像您自己解决了冲突一样,然后像往常一样继续!
git-rerere
联机帮助页包含对正常使用 rerere的非常好的、冗长的描述,它从不涉及实际调用 rerere ——这一切都是自动完成的。还有一个它没有强调的注释:它都是基于冲突的,所以即使冲突最终出现在一个完全不同的地方,它也可以重用一个解决方案,只要它仍然是相同的文本冲突。