Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 如何删除远程裸存储库分支上的提交? 问题描述_Git_Git Branch_Git Push_Git Reset_Git Bare - Fatal编程技术网

Git 如何删除远程裸存储库分支上的提交? 问题描述

Git 如何删除远程裸存储库分支上的提交? 问题描述,git,git-branch,git-push,git-reset,git-bare,Git,Git Branch,Git Push,Git Reset,Git Bare,我陷入了困境。这张图片说明了我所处的情况: 毫不奇怪,我现在无法推动绿色提交,因为非快进更新被拒绝。在远程设备上,我尝试签出开发分支,这样我就可以执行git reset--hard HEAD~1命令来删除远程设备上的提交,但这是一个纯repo,因此我无法签出开发分支。当前分支始终是“主分支”。我的目标只是删除远程上的红色提交,以便推送绿色提交 问题: 如何删除远程开发分支上的红色提交,而不必签出远程开发分支 笔记 我不想强行推动,因为其他回购协议都是从远程进行的,我不想破坏它们。但是,我知道

我陷入了困境。这张图片说明了我所处的情况:

毫不奇怪,我现在无法推动绿色提交,因为非快进更新被拒绝。在远程设备上,我尝试签出开发分支,这样我就可以执行
git reset--hard HEAD~1
命令来删除远程设备上的提交,但这是一个纯repo,因此我无法签出开发分支。当前分支始终是“主分支”。我的目标只是删除远程上的红色提交,以便推送绿色提交

问题: 如何删除远程开发分支上的红色提交,而不必签出远程开发分支

笔记
  • 我不想强行推动,因为其他回购协议都是从远程进行的,我不想破坏它们。但是,我知道还没有人从遥控器中拔出,所以我可以移除红色的commit
  • 我现在看到,在将来,当需要撤消的提交已经被推送时,我应该使用
    git revert
    命令
  • 我还有一个主分支、发布分支和各种功能分支,这些分支是为了简化图像而省略的。让我知道它们是否相关,我会添加它们
相关问题 我已经研究了这些问题(以及更多问题),但我认为它们没有解决我当前的问题,因为我不知道如何应用它们的解决方案来删除远程提交,或者它们不适用于裸回购




我不想强行推动,因为其他回购协议都是从远程进行的,我不想破坏它们。但是,我知道还没有人从遥控器中拔出,所以我可以移除红色的commit

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

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

请记住,分支只是指向存储库历史记录中的提交的指针。现在,您希望推送一个提交
E
,该提交的父级为
C
,因此在第一步中,您只需传输提交:

            /-- E
           /
A -- B -- C -- D
               ↑
             master
现在,您还告诉遥控器更新其
主分支
,使其指向
E
。在正常情况下,Git会拒绝这样做,因为
master
无法快速转发到
E
。因此,您必须强制推送它,告诉Git忽略这个事实。因此,远程存储库将如下所示:

              master
                ↓
            /-- E
           /
A -- B -- C -- D
因此,除非其他分支指向
D
(直接或间接),否则该提交现在“丢失”,最终将被垃圾收集

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


但是,如果您确定没有人提取过
D
,那么这没有什么错。那些从未拥有
D
的人不会意识到
D
消失了,并认为
master
总是这样。而所有其他在强制推进之前存在的承诺,以及后来仍然存在的承诺,都不会改变任何情况。重要的是只有通过强制推送“删除”的提交。

如果您确定其他人已拉入提交,那么强制推送正是您应该做的。
              master
                ↓
            /-- E
           /
A -- B -- C -- D