如何删除远程裸存储库分支上的提交?

How can I remove a commit on a branch of a remote bare repository?

问题描述

我已经陷入困境。此图说明了我所处的情况:

不出所料,我现在无法推送绿色提交,因为非快进更新被拒绝了。在远程上,我尝试检出 dev 分支,这样我就可以执行 git reset --hard HEAD~1 命令来清除远程上的提交,但它是一个裸仓库,所以我无法检出 dev 分支。当前分支始终是 "master." 我的目标只是删除远程上的红色提交,以便我可以推送绿色提交。

问题

如何删除远程 dev 分支上的红色提交,而不必检出远程上的 dev 分支?

备注

相关问题

我查看了这些问题(以及更多问题),但我认为它们没有解决我当前的问题,因为要么我看不出如何应用他们的解决方案来删除远程提交,或者它们不适用于裸回购。

What does "Git push non-fast-forward updates were rejected" mean?
How to undo last commit(s) in Git?
How can I fast-forward a branch without checking it out
Rebase a branch without checking it out

I don't want to force the push because other repos pull from the remote and I don't want to break them. However, I know that nobody has pulled from the remote yet, so I'm okay with just removing the red commit.

强制推送仍然是您在这里想要做的。强制推送不会神奇地破坏所有相关方的远程存储库;相反,当使用强制标志推送时,您只是告诉 Git 更新分支指针,即使这意味着需要进行非快进更改。

想象一下,这是您在(裸机)遥控器上的情况:

A -- B -- C -- D
               ↑
             master

请记住,分支只是 指向存储库历史记录中的提交的指针。现在你想推送一个以 C 作为其父项的提交 E,所以在第一步中,你只需传输提交:

            /-- E
           /
A -- B -- C -- D
               ↑
             master

现在,您还告诉遥控器更新其 master 分支,使其指向 E。在正常情况下,Git 会拒绝这样做,因为 master 不能快进到 E。因此,相反,您将不得不 强制推送 它,告诉 Git 忽略该事实。所以远程存储库将如下所示:

              master
                ↓
            /-- E
           /
A -- B -- C -- D

因此,除非其他一些分支指向 D(直接或间接),否则该提交现在“丢失”并最终将被垃圾收集。

通常,您希望避免这样做,因为每个知道提交 D(并且有一个本地分支指向它)的人都会对新的远程有问题。例如。如果我的旧本地 master 指向 D,我将不得不手动重置我的分支,以便 master 指向 E。所以通常,规则是永远不要删除我们曾经推送过的任何东西(从技术上讲,我们是从历史中删除 D)。

但是,如果您确定没有人提取过 D,那么这就没有错。没有过D的人不会意识到D消失了,还以为master一直都是这样。在强制推送之前存在并且之后仍然存在的所有其他提交都不会改变任何情况。重要的是只有用你的强制推送“删除”的提交。