这是我的实验。
git init
echo hello > some.txt
git add some.txt
-- objects
-- f2 (blob "hello")
echo hola > some.txt
git add some.txt
-- objects
-- f2 (blob "hello")
-- 53 (blob "hola")
git commit -m "..."
-- objects
-- f2 (blob "hello")
-- 53 (blob "hola")
-- 5c (tree
"some.txt" -> 53)
-- 61 (commit "tree 5c")
正如我们可以看到每个“git add”创建了blob对象,而“git commit”提交了最后一个blob 53.
但请注意,中间blob“f2”仍在存储库中。这有什么理由吗?我怎么能用这个blob?或者我该如何删除它?
答案 0 :(得分:7)
Git将所有内容保存至少一段时间。如果你运行
git fsck
你应该看到
dangling blob f2...
这是一个git的设计,让未引用的东西停留一段时间。这个想法是,如果你“哎呀”某事,那么文件仍然存在。它也是一种“懒惰优化”,其中添加一些内容可以保存状态以便作为内容寻址文件提交,而提交内容只是建立对这些文件的引用。清理部分是分开的。您应该查看git prune和git gc的文档。
默认情况下,它会在至少2周后发生的git gc
运行中被清理干净。此外,在积极清理的情况下,git reflog(通常用于挽救提交和改变所有事情的工具)的效用将会丢失。