2

在我的 Git 分支上,我创建了一个提交并推送。后来,我添加了对索引的更改, used git commit --amend,然后git push -f. 我的新提交覆盖了我分支上本地和远程的第一个提交。

此时,我希望(或希望)原始提交不再存在,或者至少存在(可能在 reflog 中)但不再有父提交,因此,一旦我运行 GC,它将不复存在. 但是,提交似乎仍然存在,并且其父级仍然完好无损。(在这种情况下,我发现它的方式是通过 Jira,它将我链接到我在 github 上的覆盖提交)

为什么呢?它将如何被删除?这是否意味着,每当我不小心将密码推送到 GitHub,然后使用git commit --amendor git reset,然后git push -f,提交实际上永远不会真正被删除?

4

2 回答 2

1

来自git help gc

--prune=<date>

修剪早于日期的松散对象(默认为 2 周前,可由配置变量 gc.pruneExpire 覆盖)。--prune=all修剪松散的物体,无论其年龄大小。--prune默认开启。

所以你可能想运行git gc --prune=all.

于 2015-09-10T11:42:15.530 回答
1

git 2.7(2015 年第四季度)引入了关于“ git gc --prune=all”的警告

请参阅Junio C Hamano ( ) 的提交 fae1a90(2015 年 10 月 14 日(由Junio C Hamano 合并 -- --ce555f3 提交中,2015 年 10 月 20 日)gitster
gitster

Documentation/gc: 警惕--prune=<now>

" git gc" 可以随时安全运行,只是因为它具有内置的宽限期来保护由等待 ref 更新以将它们锚定到历史记录的其他进程创建的对象。
为了在没有宽限期的情况下运行,用户必须确保存储库是 quiescent

静止:在git 用户手册页中已经提到:

您应该只git prune在静态存储库上运行——这有点像进行文件系统fsck恢复:您不想在挂载文件系统时这样做。

所以静止意味着处于不活动或休眠的状态或时期。

新文档提到:

--prune=all修剪松散的对象,无论它们的年龄如何
除非您确切知道自己在做什么,否则不要使用。 除非存储库处于静止状态,否则您将丢失尚未使用 ref 锚定的新创建的对象并最终破坏您的存储库--prune=all
)。
--prune默认开启。

于 2015-10-21T05:31:42.563 回答