我目前的git日志是
我想丢弃Including OpenCV
并删除相同的(因为它包含了很多不需要的库数据),我只是想保留我现在所拥有的并推送它。
当推送被拒绝时我尝试了什么:
1)Rebase导致了
2)合并导致
我想要的是:
根据评论更新
原始回复
好的,所以遥控器有
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
并不一定能保证C
在clone
,fetch
或pull
期间永远不会被转移(虽然你不会期望它;它取决于服务器是否尝试使用现有包文件的快捷方式) 。并且在任何情况下它都不会释放原产地内的空间。
在本地回购中,你需要做的是让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服务器等),那么您可以像本地存储一样清理它。
当然,每个其他本地仓库都带有提交副本,直到该仓库被清理完为止,只需将二进制膨胀放回远程。