Rebase合并从未发生过

Rebase merge to have never happened

由于(非常奇怪的)情况,我现在有一个 git 有 2 个根的存储库。我想删除导致第二个根出现的合并。从技术上讲,这些 "roots," 中的每一个都是父级为 0.

的提交

我想摆脱导致有两个根的合并。

我使用了 git cherry-pick 但没有用,似乎没有应用任何更改。

明确一点,我希望 a'、b' 和 c' 全部消失(它们是 a、b 和 c 的损坏副本,由错误的 rebase 造成)。

a <- b <- c \ / g <- h \ d -f origin/master a' <- b' <- c' / \ i <- j /

如果交流或其他人的工作已经基于其祖先 d 的任何东西是一个问题,请考虑仅使用这两个根,如果您喜欢其余的提交,它们几乎是后果-无论如何都是免费的。

你想转储合并的效果,还是只转储祖先?

如果提交 d 包含您要保留的更改,或者不包含任何更改,

echo `git rev-parse $d $d^` >.git/info/grafts
git filter-branch -- --all
rm .git/info/grafts

会的。

如果提交 d 包含您不想保留的更改,那么您可以使用

将合并变基
git rebase -p --onto $d^ $d..origin/master

$ 是 shell 变量语法,用您喜欢的任何引用替换命名提交。

像这样的任何历史重写都会对基于(即可以追溯到祖先)重写的一个提交的其他提交产生连锁反应。因此,之后,您需要强制推送 origin/master 并让其他所有人重新获取并进行任何必要的变基,如果他们将自己的工作基于自 c.

以来的任何提交