2

这是我的实验。

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?或者我怎样才能删除它?

4

1 回答 1

8

Whee 花了我一分钟才明白你在问什么:)

Git 将所有内容保存至少一段时间。如果你跑

git fsck

你应该看到

dangling blob f2...

这是 git 的一种设计,可以让未引用的东西搁置一段时间。这个想法是,如果您“哎呀”某些东西,该文件仍然可以找到。这也是一种“惰性优化”,其中添加某些内容可以将提交状态保存为内容寻址文件,而提交某些内容只是建立对这些内容的引用。清理部分是分开的。您应该查看git prunegit gc的文档。

默认情况下,它会git gc在至少 2 周后发生的一些运行中被清理。此外,在积极清理的情况下, git reflog的实用程序(通常用于挽救把所有事情搞砸的提交和变基)将丢失。

于 2009-08-27T15:12:50.910 回答