这是我的实验。
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?或者我该如何删除它?
最佳答案
Whee 花了我一分钟时间才明白你在问什么 :)
Git 至少会在一段时间内保存所有内容。如果你跑
git fsck
你应该看到
dangling blob f2...
这是 git 的一种设计,让未引用的东西搁置一段时间。这个想法是,如果您“哎呀”了一些东西,该文件仍然可以找到。这也是一种“惰性优化”,其中添加一些内容可以将提交状态保存为内容寻址文件,而提交一些内容只是建立对这些内容的引用。清理部分是分开的。您应该查看 git prune 的文档和 git gc .
默认情况下,它会在至少 2 周后运行的 git gc
中得到清理。此外,git reflog 的效用(通常用于挽救搞砸一切的提交和 rebase )在积极清理的情况下会丢失。
关于git - "git add"之前的多个 "git commit",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1341675/