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
.
以来的任何提交
由于(非常奇怪的)情况,我现在有一个 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
.