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

时间:2015-03-10 19:10:48

标签: git git-branch git-push git-reset git-bare

问题描述

我已经把自己变成了一个gitpickle。这张图片说明了我自己所处的情况:

Dev commits

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

问题

如何在不必检查遥控器上的dev分支的情况下删除远程开发分支上的红色提交?

备注

  • 我不想强行推动,因为其他回购物从遥控器拉出来,我不想打破它们。但是,我知道没有人从遥控器中撤出,所以我只是删除了红色提交。
  • 我现在看到,将来,当我们已经推送了需要撤消的提交时,我应该使用git revert命令。
  • 我还有一个主分支,发布分支,以及我为了简化图像而遗漏的各种功能分支。让我知道他们是否相关,我会添加它们。

相关问题

我已经查看了这些问题(以及更多问题),但我认为他们没有解决我当前的问题,因为要么我不知道如何应用他们的解决方案来删除提交在遥控器上,或者他们不为裸回购工作。

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

1 个答案:

答案 0 :(得分:2)

  

我不想强迫推,因为其他回购从遥控器拉,我不想打破它们。但是,我知道没有人从遥控器中撤出,所以我可以删除红色提交。

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

想象一下,这是你(裸)遥控器的情况:

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

请记住,分支只是指针,可以在存储库的历史记录中提交。现在您要推送一个以E作为其父项的提交C,因此在第一步中,您只需转移提交:

            /-- 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总是这样。并且在强制推动之前存在并且仍然存在的所有其他提交不会改变有关情况的任何内容。重要的只是用你的强制推动“删除”的提交。