如何删除 Git 中过去的合并历史记录?

How to remove the past merge history in Git?

我在 git 中进行了错误的合并,想从本地和远程存储库中删除有关合并的过去历史记录。 该图显示了分支和提交历史。

此处,prod 分支包含一些特定于分支的信息(例如,db.yml)。我错误地将 prod 分支合并到 master。结果,master 的远程存储库现在包含了 C 和 W 之间的所有过去提交。我想要的是保持 master 的历史记录在 [=] 中清除 db.yml 的更改11=]分支。

在上图中,我想要的是删除指示的棕色线,以便 master 分支中 X 之前的提交就 master 分支而言是提交 B,并且master 的远程存储库不应该知道 of prod 分支,它是在提交 B.

之后分支出来的

换句话说,我只想在 master 分支中删除从提交 W 到 X 的合并历史记录(已推送到 master 存储库),同时我想保留提交 C到 prod 分支中的 W(它有一个单独的远程存储库)。在这种情况下,git rebase 中解释的简单策略 past answer like this 似乎效果不佳。或者,有什么办法吗?

我怎样才能做到这一点?

git checkout -B master B     # re-hang the `master` label on the commit before the oops
git cherry-pick Y            # make the history it should have
git checkout -B prod W       # likewise with `prod`: back to before the oops
git merge master             # make the history it should have

除非您习惯于执行通常被称为“邪恶合并”的操作,即合并不相关的更改,否则您根本不想保留 X。这是从 prodmaster 的合并。

git push --force-with-lease origin master   # overwrite if nothing's changed since

如果 prod 也住在那里,同样如此。