为啥提交在 github 上可见但在本地代表中不可见?
Posted
技术标签:
【中文标题】为啥提交在 github 上可见但在本地代表中不可见?【英文标题】:why are commits visible on github but not in local rep?为什么提交在 github 上可见但在本地代表中不可见? 【发布时间】:2021-11-17 07:32:11 【问题描述】:我注意到在执行一些 git 操作后,一些提交丢失,正如预期的那样,但在 github 上仍然可见,错误为:This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
重现我所做的:
-
存储库现在是:
A -> B -> C
软重置提交A
重做提交B
和C
作为B(mod)
和C(mod)
存储库现在是:A -> B(mod) -> C(mod)
强制推送到 github
现在提交 B
和 C
在代表历史记录中看不到,但在 github 上可见并出现上述指定错误
(我可以看到的示例链接:https://github.com/user/rep/commit/B ; 而https://github.com/user/rep/commit/B(mod) 出现预期的修改)
可能是什么原因造成的? rep 是否包含提交B
和C
?如果是,我该如何删除它们/清理代表?
谢谢
【问题讨论】:
要真正删除提交并确定它已经消失,您可能需要联系支持人员。 github 有 undo 支持,并且可能会进行垃圾收集 docs.github.com/en/authentication/… ***.com/a/32840385/7976758 发现于***.com/… 【参考方案1】:分支或标签是应用于单个提交的名称。该提交是一个 named 提交。使提交保持活力的是它是父级,或者父级的父级,或者... [等等] 命名提交。
好的。将分支重置回 A 意味着分支名称现在适用于 A,而不适用于 B 或 C。因此没有任何东西可以让 B 或 C 继续存在。
但它们也不会立即被销毁。政策是此类提交一直保留到它们被垃圾收集为止。如果您使用reflog
,您会发现它们仍然存在于您的本地计算机上。这就像在您的计算机上您不只是删除文件一样;您将文件放入垃圾箱,稍后清空垃圾箱。好吧,Git 最终会清空它的垃圾。
您可以通过forcing a garbage collection now 从您的计算机中删除它们。但是你不能在 GitHub 上这样做;它不属于你。如果你只是等待,它们最终会在 GitHub 上被销毁。
如果事情对您来说很紧急,请获取您的本地存储库并完全删除 GitHub 存储库。创建新的 GitHub 存储库并将您的本地镜像到它。
【讨论】:
感谢您的明确回答!如何查看我的代表中的哪些提交在“垃圾”中?如何强制垃圾回收? 我执行了git gc --aggressive
,但似乎没有任何改变,如果我执行git show B
,提交仍然存在
你说的是git gc --prune=now --aggressive
吗?您确定 B 无法从任何其他分支或标签名称访问吗?
请注意,GitHub 不承诺默认在任何合理的时间范围内删除这些对象。你真的必须联系 GitHub 支持(或使用删除 repo 方法)。在本地,您需要在运行 git gc
之前使 reflogs 过期。 (好吧,我认为您可以在运行git gc
时使它们过期。尚未测试。)
@matt 我现在执行了git gc --prune=now --aggressive
,我认为它删除了一个所谓的“悬空 blob”,但原始的 B 和 C 提交没有受到影响。如何检查提交 B 和 C 是否可达?以上是关于为啥提交在 github 上可见但在本地代表中不可见?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 javascript 在 github 页面上无法正常工作?