Git 启动分支太晚,请更改我分支的父级

Git 启动分支太晚,请更改我分支的父级,git,Git,我有以下情况: A---B---F---G---H (master) \ \ C---D---E (experimental) 我的问题是B是一件非常非常糟糕的事情,不应该发生在master上。它属于实验。但是F--G--H是可以的。有没有办法让一切看起来像这样: A---F'---G'---H' (master) \ \ B---C---D---E (experiment) 我读过关于rebase和类似的东西,但最大的问题是,master已经被推到

我有以下情况:

A---B---F---G---H (master)
     \
      \
       C---D---E (experimental)
我的问题是B是一件非常非常糟糕的事情,不应该发生在
master
上。它属于
实验
。但是F--G--H是可以的。有没有办法让一切看起来像这样:

A---F'---G'---H' (master)
\
 \
  B---C---D---E (experiment)
我读过关于rebase和类似的东西,但最大的问题是,
master
已经被推到
origin
git-rebase上了B master
就可以了

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

一般来说,公共回购中的分支应该保持不变,这意味着您不能期望从主控中删除commit B,您所能做的就是修复commit B在新commit中引入的错误,并将其再次推送到主控

如果可以通知您的团队成员有关重新基础的信息,并且您坚持这样做,则可以进行重写,只需确保这不会经常发生。

在master上,运行:

git还原B

然后,如果提交的下游更改不受其直接影响,则可以安全地推送(即,可以删除提交
B
的内容,而不会打乱其后的其他更改。听起来确实如此。)

这将产生:

A---B---F---G---H---I (master)
     \
      \
       C---D---E (experimental)
其中
I
是还原提交。Master保留其历史记录,同时删除
B
的内容,保留
B
的更改


如果以后将Experiative合并到master中,您可能必须还原提交
I

这种矛盾
不要重新设置推送到公共存储库的提交的基础。
从“是”,但您要求的是重写历史,
git-rebase
正是这种情况下的工具。一般来说,公共回购中的分支应该保持原样,这意味着您不能期望在master中删除commit B,您所能做的就是修复B在新commit中引入的错误并再次推送它。但是,如果有可能通知您的团队成员有关重基的情况,那么重写也可以,只要确保不会经常发生这种情况。我将使用此选项。谢谢负号是怎么回事?有什么意见吗?我也不知道,但我想有人只是认为这样做不是一个好的做法。我已经用评论中的一些要点更新了答案,这可能有助于澄清问题。团队中是否有太多人需要手动通知您是否应该重新设置master的基础?如果是这样的话,你可以简单地
git revert B
我需要把B保留在实验分支上感谢你的回答,但这会让历史看起来很复杂,所以我想我会冒险让我的两个开发伙伴生气,然后使用rebase+不过我还是给你一个。