问题描述
我已经陷入了困境。这张图片说明了我所处的情况:
不出所料,我现在无法推送绿色提交,因为非快进更新被拒绝了。在远程,我尝试检查 dev 分支,这样我就可以执行 git reset --hard HEAD~1
命令来清除远程上的提交,但它是一个裸仓库,所以我可以'检查开发分支。当前分支始终是“master”。我的目标只是删除远程上的红色提交,以便我可以推送绿色提交。
问题
如何在不 check out 远程开发分支的情况下删除远程开发分支上的红色提交?
注意事项
- 我不想强制推送,因为其他存储库从远程 pull ,我不想破坏它们。但是,我知道还没有人从远程中 pull 出,所以我可以只删除红色提交。
- 我现在明白了,在需要撤消的提交已经被推送时,我应该在未来使用
git revert
命令。 - 我还有一个 master 分支、release 分支和各种功能分支,我为了简化图像而省略了这些分支。让我知道它们是否相关,我会添加它们。
相关问题
我已经查看了这些问题(以及更多),但我认为它们没有解决我当前的问题,因为要么我不知道如何应用他们的解决方案来删除远程提交,要么他们不适用于裸 repo 。
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 更新分支指针,即使这意味着需要进行非快进更改。
想象一下,这是您在(裸机) Remote 上的情况:
A -- B -- C -- D
↑
master
请记住,分支只是指向存储库历史记录中的提交的指针。现在你想推送一个以 C
为父级的提交 E
,所以在第一步中,你只需传输提交:
/-- E
/
A -- B -- C -- D
↑
master
现在,您还告诉 Remote 更新其 master
分支,使其指向 E
。在正常情况下,Git 会拒绝这样做,因为 master
不能快进到 E
。因此,相反,您必须强制推送它,告诉 Git 忽略该事实。因此远程存储库将如下所示:
master
↓
/-- E
/
A -- B -- C -- D
因此,除非其他一些分支指向 D
(直接或间接),否则该提交现在“丢失”并最终将被垃圾收集。
通常,您希望避免这样做,因为每个知道提交 D
(并且有一个本地分支指向它)的人都会对新的远程有问题。例如。如果我的旧本地 master
指向 D
,我将不得不手动重置我的分支,以便 master
指向 E
相反。所以通常,规则是永远不要删除我们曾经推送过的任何内容(从技术上讲,我们从历史中删除 D
)。
但是,如果您确定没有人获取过D
,那么这就没有错。从未有过D
的人不会意识到D
消失了,还以为master
一直都是这样。在强制推送之前存在并且之后仍然存在的所有其他提交都不会改变任何情况。重要的是通过强制推送“删除”的提交。
关于git - 如何删除远程裸存储库分支上的提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28972147/