从本地和远程分支删除先前的提交

时间:2019-04-23 12:37:24

标签: git

我的分支中有一些提交说 提交A 提交B 提交C 提交D 提交E

我必须删除提交D,并保持提交A,B,C不变。这些提交已被推送到远程分支。

我已经尝试过sol1,但不允许我强制将更改推送到远程分支。

我不想对提交A,B和C进行git reset,并希望保持它们不变。

那怎么办?

1 个答案:

答案 0 :(得分:2)

有两种方法可以删除D的更改,同时保留ABCE的更改。

一种是还原D

git revert HEAD^
git push

这将在~D之后创建一个新的提交E。由于它不会更改历史记录,因此不需要强制推动,这可以解决您在上一次解决方案尝试中阻止您所说的内容。这确实意味着历史记录将显示D的更改及其撤消;有些人不喜欢这样,但是您可能不得不问自己是否可以负担得起这种虚荣心。

您可以在此处了解有关还原的更多信息:https://git-scm.com/docs/git-revert

另一个选择是重写历史记录。听起来您已经尝试过此操作,但无法使遥控器接受强制推动。人们有充分的理由将遥控器配置为拒绝强制推送,尽管它确实取决于您的团队和项目,但您应该了解与强制推送相关的成本。

要理解的是,它可能看起来像有很多解决方案可以物理删除D-重新设置基准,重置,选择樱桃,甚至可以使用过滤分支...但是他们都归结为同一件事。如果在处理结束时,您希望D(以前在分支的历史记录中)不再在分支的历史记录中,那么您正在尝试重写历史记录,并且需要< / em>才能强制执行。因此,如果强制推送失败了-也就是说,如果您已经达到本地状态,那么

A -- B -- C -- E'

并且您无法将其推送到远程-那么寻找其他历史记录重写技术毫无意义;他们都会以“强行推向遥控器”为结束。

因此,在这种情况下,唯一剩下的选项是git revert