我有以下情况:
A---B---F---G---H (master)
\
\
C---D---E (experimental)
我的问题是,B是master
不应该发生的非常非常糟糕的事情。它属于experimental
。但是F --- G --- H没问题。有没有办法让一切看起来像这样:
A---F'---G'---H' (master)
\
\
B---C---D---E (experiment)
我已经阅读了关于rebase和类似的内容,但最大的问题是master
已被推送到origin
。
答案 0 :(得分:5)
在master上,运行:
git revert B
然后,如果该提交的下游更改不受其直接影响,则可以安全地进行推送(即,可以删除提交B
的内容而不会破坏其后发生的其他更改。听起来就是这样。)
这将创建:
A---B---F---G---H---I (master)
\
\
C---D---E (experimental)
其中I
是还原提交。 Master保留其历史记录,同时删除B
的内容,实验保留B
的更改。
如果您稍后将实验合并到母版中,则可能必须还原提交I
。
答案 1 :(得分:3)
git rebase --onto A B master
会这样做。
似乎你已经将master推送到orgin,如果你确定覆盖原点的master分支是安全的,只需在master分支上执行git push -f
。请注意,它可能会导致其他开发人员从原点撤离时发生冲突。
通常,公共仓库中的分支应保持不变,这意味着您不能指望从主服务器中删除提交B,您所能做的就是修复提交B在新提交中引入的错误并将其再次推送到主服务器。 / p>
如果可以告知你的团队成员有关rebase的事情并且你坚持这样做,那么重写是可以的,只要确保这不会经常被嘲笑。