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