代码之家  ›  专栏  ›  技术社区  ›  alex2k8

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

  •  2
  • alex2k8  · 技术社区  · 15 年前

    这是我的实验。

    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”仍在存储库中。这有什么原因吗?我该怎么用这个斑点?或者我如何移除它?

    1 回复  |  直到 15 年前
        1
  •  7
  •   Jeff Ferland    15 年前

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

    Git至少保存了一段时间。如果你跑

    git fsck
    

    你应该看看

    dangling blob f2...
    

    这是一个让未被引用的东西坐一段时间的Git设计。其想法是,如果你“哎呀”什么的话,文件仍然存在。这也是一个“懒惰的优化”,在这里添加一些东西可以保存提交为内容寻址文件的状态,提交一些东西只是构建对这些文件的引用。清理部分是单独的。您应该查看文档 git prune git gc .

    默认情况下,在运行 git gc 至少两周后会发生这种情况。另外,它的效用 git reflog (通常用于挽救把所有事情都搞砸的承诺和再平衡)会在积极清理的情况下丢失。