Git:删除分支提交推送到远程

问题描述 投票:0回答:1

我目前的git日志是

enter image description here

我想丢弃Including OpenCV并删除相同的(因为它包含了很多不需要的库数据),我只是想保留我现在所拥有的并推送它。

当推送被拒绝时我尝试了什么:

1)Rebase导致了

enter image description here

2)合并导致

enter image description here

我想要的是:

enter image description here

git
1个回答
0
投票

根据评论更新


原始回复

好的,所以遥控器有

A -- B -- C <--(master)

在本地你看到这个

A -- B -- C <--(origin/master)

但你也有自己的基于B的提交

A -- B -- C <--(origin/master)
      \
       D <--(master)

现在丢弃C意味着你想从C的历史中删除origin/master;这是一个历史重写,影响通过远程仓库共享的提交,因此您需要与repo的所有其他用户协调才能安全地执行此操作。 (如果你试图在没有这种协调的情况下做到这一点,那么可能的结果就是其他人最终会撤消你做的任何事情。)

从纯机械的角度来看,如果你说的话

git push -f origin master

(如果你有足够的访问权限),它会将origin/master“移动”到master,让C“无法访问”。

这不会从回购中删除C。它不是真的(正如其他人在评论中所说的那样)它无法撤消 - 实际上如果回购有其他用户并且你没有与它们协调,它可能会被意外撤消。它确实将origin的每个克隆(除了你自己的)都处于需要恢复的破坏状态 - 请参阅git rebase文档中的“从上游rebase恢复”(因为任何远程历史重写相当于这方面的上游rebase) )。

虽然让C无法访问已经足够你不会看到它,除非你知道要找它,如果你想真正删除C还有更多涉及 - 特别是如果你需要它从遥控器中移除,并且不想要冒险“重新出现”(这意味着你需要将其从其他人的本地仓库中移除)。除非C占用大量磁盘空间或包含敏感数据,否则最好将其保留在历史记录中并使用新提交来撤消其应用的更改(请参阅git revert)。

请注意,正如您在“不起作用的”两个示例中所示,合并或重新定位与您可能想要的相反;他们将不需要的提交带入你的master历史。如果你采取建议还原而不是重写历史,你仍然会这样做。


更新

澄清“坏”提交带来了大量数据,似乎需要重写;但如上所述,只需重写ref不会从repo中删除提交。

也就是说,将origin/master移动到D并不一定能保证Cclonefetchpull期间永远不会被转移(虽然你不会期望它;它取决于服务器是否尝试使用现有包文件的快捷方式) 。并且在任何情况下它都不会释放原产地内的空间。

在本地回购中,你需要做的是让C无法访问,然后让gc运行。但让C真正无法到达意味着不仅要移动origin/master ref(以及可能达到C的任何其他refs,可能包括你必须知道要查找的一些),还要清除任何指向C的reflogs。

幸运的是,reflogs是临时的,本地的,有点“有用的时候有用”;因此,只有rm -rf .git/logs可能是安全的,并完成此事。但是这会抛弃你当前的所有reflog,所以如果你想要更有选择性,请参阅git reflog文档。

然后你可以手动调用gc,就像

git gc --aggressive --prune=now

希望这将在当地收回空间。

gc在遥控器上运行是另一回事,它取决于远程托管的方式。最坏的例子:截至我检查的最后一个版本,TFS没有提供触发gc的方法;所以最简单的方法是将垃圾箱丢弃并重新开始。但是当然如果您只是将它托管在共享驱动器上(使用ssh或Web服务器等),那么您可以像本地存储一样清理它。

当然,每个其他本地仓库都带有提交副本,直到该仓库被清理完为止,只需将二进制膨胀放回远程。

© www.soinside.com 2019 - 2024. All rights reserved.