我注意到,我在Git中压扁了一堆提交后,仍然可以查看单个提交。其中一个与所有其他提交相关的提交是使用提交消息引用它所提交的提交的哈希进行恢复。在这个哈希上做一个git show
向我展示了这个提交的确切内容。这个提交在我的历史中并没有出现,因为它被压缩到一个提交中。压扁后查看单个提交
这怎么可能?这仍然是躺在DAG的某个地方吗?当像git gc
这样的东西运行时,它最终会被Git收集到垃圾吗?
我注意到,我在Git中压扁了一堆提交后,仍然可以查看单个提交。其中一个与所有其他提交相关的提交是使用提交消息引用它所提交的提交的哈希进行恢复。在这个哈希上做一个git show
向我展示了这个提交的确切内容。这个提交在我的历史中并没有出现,因为它被压缩到一个提交中。压扁后查看单个提交
这怎么可能?这仍然是躺在DAG的某个地方吗?当像git gc
这样的东西运行时,它最终会被Git收集到垃圾吗?
是:每当你在Git中做几乎任何事情,你真是添加新对象(提交和文件,例如)到库,到位离开现有的对象。主要的例外是git gc
,但即使这样也会使现有对象一直存在,直到它们过期。
准确到期有点复杂。所有对象通常会存活至少两周,以便在慢速操作过程中不会被移除(这可能需要几秒钟甚至几分钟,在此期间对象不会被记录在任何地方)。
除此之外,对象ID写入引用,例如在树枝上的承诺,或者记录在HEAD
(主要是提交的ID)-normally也被写入到每个分支引用日志(有一个单独的日志HEAD
)。这些文字在写入时会加上时间戳,并且默认情况下这些条目可以保存30天或90天。那些活的更长的是,从参考文献的顶端可以得到:即对于HEAD
,提交仍然在HEAD
的历史记录中,对于分支,仍然在分支上的提交。寿命较短,30天到期的承诺是那些不再在分支上的承诺(例如经过重新设计和/或压扁)。
这些reflog条目用于保护对象不受Grim 收割机收集器。所以这意味着你的旧提交将持续30天左右,而不仅仅是所有事情得到的14天。
删除引用(例如git branch -D branch
)会导致其引用日志也被删除。因此,如果reflog条目仅在已删除的分支中,则宽限期可能会缩短到创建对象后的14天。
衍合的提交仍然是由专门的名字ORIG_HEAD
引用为好,直到事情(通常是另一重订)覆盖ORIG_HEAD
。所以这可以保证提交超过30天的默认值。
直到git gc
实际运行并删除一个对象,但它会坚持。它通常不会被复制到克隆中,但如果git gc
从不需要运行,它可能仍会存储在您的存储库中,可访问多年。
这是一个非常全面的答案,并解释了很多东西,谢谢! – Aaron
基本上,是的。 :-) – melpomene