5

我有以下情况:

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.

4

2 回答 2

5

在 master 上,运行:

git revert B

然后,您可以安全地推送,如果该提交的下游更改没有直接受到它的影响(即,B可以删除提交的内容而不会破坏其后的其他更改。听起来确实是这种情况。)

这将创建:

A---B---F---G---H---I (master)
     \
      \
       C---D---E (experimental)

I还原提交在哪里。Master 保留它的历史,同时删除B,experimental的内容B的变化。

I如果您稍后将实验性合并到主控中,您可能必须恢复提交。

于 2012-08-28T16:09:32.323 回答
3

git rebase --onto A B master会做。

似乎您已经将 master 推送到了 orgin,如果您确定覆盖 origin 的 master 分支是安全的,只需git push -f在 master 分支上执行。请注意,这可能会导致其他开发人员在从源中提取时发生冲突。

通常,公共仓库中的分支应该保持不变,这意味着您不能期望从 master 中删除提交 B,您所能做的就是在新提交中修复提交 B 引入的错误并再次将其推送到 master。

如果可以将变基通知您的团队成员并且您坚持这样做,那么重写是可以的,只要确保不会经常发生这种情况。

于 2012-08-28T16:02:15.577 回答