2016-09-08 101 views
0

我注意到,我在Git中壓扁了一堆提交後,仍然可以查看單個提交。其中一個與所有其他提交相關的提交是使用提交消息引用它所提交的提交的哈希進行恢復。在這個哈希上做一個git show向我展示了這個提交的確切內容。這個提交在我的歷史中並沒有出現,因爲它被壓縮到一個提交中。壓扁後查看單個提交

這怎麼可能?這仍然是躺在DAG的某個地方嗎?當像git gc這樣的東西運行時,它最終會被Git收集到垃圾嗎?

+1

基本上,是的。 :-) – melpomene

回答

2

是:每當你在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從不需要運行,它可能仍會存儲在您的存儲庫中,可訪問多年。

+0

這是一個非常全面的答案,並解釋了很多東西,謝謝! – Aaron