【问题标题】:Remove past (double) merge commits from history从历史记录中删除过去的(双重)合并提交
【发布时间】:2021-10-15 05:01:58
【问题描述】:

我想在 Git 中执行以下转换:删除 2 个合并提交并将它们替换为来自 2 个绿色和粉红色分支的单个提交(我想要一个线性历史)

我检查了关于 SO 的类似问题,我认为这些命令可以简单地完成工作,没有任何冲突,因为 Git 足够聪明,可以在变基时使用合并提交:

git checkout master
git rebase c
# (I am allowed to force-push btw)
git push --force

但是由于提交 C .... :(

是否有任何方法可以实现这种线性提交历史,而无需解决任何冲突?我应该分两步以上吗?

注意1:实际上在 E 和 D 之间、c 和 a 之间以及 1 和 2 之间还有更多的提交,所以我想避免繁琐的手动挑选...... :) (我发布了一个问题的简化图)

注意2:当只有一个合并提交时,它工作正常,遵循this SO answer 中的第三个提示。但是这里有 2 个合并提交,如图所示。

提前感谢您的帮助?

【问题讨论】:

  • 可以git rebase做这种事情,但正确的做法是......不要这样做。说真的,不要这样做。这不值得努力。我以前自己做过,不值得。

标签: git rebase


【解决方案1】:

如果您想要所有单独的提交,请选择fast-forward merge

因为你已经合并了,你应该能够重新合并提交或cherry-pick 'em over(尽管这几乎肯定比留下东西更糟糕而且不那么明显原样)


在您的示例中,如果在C 之后合并的其他分支中存在任何冲突更改,您需要将其重新生成为一些C',其中包含分支的合并冲突修复和C

此外,历史 是线性的,并且假设在您的示例中,D 之前粉红色分支的未标记合并是C 之上的壁球合并,则该合并实际上包含两者

  • 粉色分支中的所有提交
  • 需要任何合并冲突更改(需要此修复程序的一种形式,以及当您尝试变基时 git 抱怨的内容)

您可以通过尝试还原它来显示它How to revert a merge commit that's already pushed to remote branch?


您将来可能想要的是定期将您的主分支合并到您的开发分支中

【讨论】:

  • 感谢您的回答。这不是我的提交历史,我实际上正在清理一堆陈旧的分支和大量的合并冲突......我已经编辑了我的问题,提到实际上在 E 和 D 之间、c 和 a 之间还有更多的提交和在 1 和 2 之间,所以我想避免繁琐的手动挑选...... :) (我已经为这个问题发布了一个简化的图表)我已经更改了 repo 设置以只允许快进合并.. . 但我希望整个历史都是线性的(用于更改日志生成、git bisect 使用等......)
  • 我可以将 master 重新设置为绿色合并提交吗?我猜没有?
猜你喜欢
  • 1970-01-01
  • 2016-03-13
  • 2014-06-24
  • 2023-01-22
  • 2021-06-12
  • 2013-09-20
  • 2012-12-14
  • 2014-11-20
  • 1970-01-01
相关资源
最近更新 更多