git - 更聪明的 rebase 避免冗余工作?

标签 git git-rebase git-diff

我在使用长 rebase 时遇到的一个问题是必须解决冗余冲突。假设我有一个分支,其中包含一系列不断修改函数的提交,而最终提交完全删除了该函数。

当我执行 rebase master 时,Git 天真地依次应用每个提交。这意味着我需要在 master 的提示下解决这些提交中的每一个 - 即使最终这些工作被浪费了。

处理这种情况的好方法是什么?也许我应该只为整个分支生成一个补丁,然后将其应用于 master?如果是这样,有没有办法保留一些历史?想法、建议等

最佳答案

您想使用 git rerere结合使用 rerere-train.sh 从历史提交中教授 rerere 数据库(您可能已经在 /usr/share/doc/git/contrib/rerere-train.sh 中找到它)。这允许 git 自动使用从历史中学习的 merge 冲突解决方案。

警告:您基本上是通过盲目地使用历史字符串替换来修复冲突的 merge ,让 git 重写源代码。您应该在 rebase 之后查看所有冲突的 merge 。我发现 gitk 对此工作正常(它将仅显示冲突解决作为 merge 补丁)。我对 rerere 只有很好的体验,你可能没那么幸运。基本上,如果您的历史记录确实包含损坏的 merge (即技术上不正确完成的 merge ,然后在后续提交中修复),您不想使用历史记录中的 rerere,除非您想要自动为您完成类似的中断 merge 。

长话短说,你只要跑

git config --global rerere.enabled 1
bash /usr/share/doc/git/contrib/rerere-train.sh --all

然后是您真正想做的 rebase ,它应该会神奇地起作用。

全局启用rerere后,以后就不需要再学习历史了。只有在启用 rerere 之前冲突解决已经完成之后,才需要使用 rerere 学习功能。

附言。我找到了另一个问题的类似答案:https://stackoverflow.com/a/4155237/334451

关于git - 更聪明的 rebase 避免冗余工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10601541/

相关文章:

Github for mac diff 选项

git - 项目管理软件,可用选项

git rebase 颠倒过来

git - 如何将一个文件与 Git 中的任意版本进行比较?

git - 如何注释 git 存储库?

git - 如何在 Vim 中刷新 git diff 输出

git - 支持哪些 git url 格式?

Git 工作流程和 rebase 与 merge 问题

git - 如何基于新版本的 cherry-pick 的 parent

windows - 如何在 Windows GUI 中执行 rebase --interactive