"git commit"之前的多个"git add"

ale*_*2k8 2 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")
Run Code Online (Sandbox Code Playgroud)

我们可以看到每个"git add"都创建了blob对象,而"git commit"提交了最后一个blob 53.

但请注意,中间blob"f2"仍在存储库中.这有什么理由吗?我怎么能用这个blob?或者我该如何删除它?

Jef*_*and 7

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

Git至少可以保存所有内容一段时间.如果你跑

git fsck
Run Code Online (Sandbox Code Playgroud)

你应该看到

dangling blob f2...
Run Code Online (Sandbox Code Playgroud)

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

默认情况下,它会git gc在至少2周后的某些运行中清理干净.此外,在积极清理的情况下,git reflog(通常用于打捞提交和重新安装的东西)的实用程序将丢失.