“git commit”之前的多个“git add”

时间:2009-08-27 15:03:13

标签: git commit add

这是我的实验。

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?或者我该如何删除它?

1 个答案:

答案 0 :(得分:7)

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

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

git fsck

你应该看到

dangling blob f2...

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

默认情况下,它会在至少2周后发生的git gc运行中被清理干净。此外,在积极清理的情况下,git reflog(通常用于挽救提交和改变所有事情的工具)的效用将会丢失。