2009-08-27 65 views
2

這是我的實驗。「git commit」前的多個「git 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") 

正如我們可以看到每一個「混帳添加」創建Blob對象,而「git的承諾」 COMMITED最後一滴53

但是請注意,中間的斑點「F2」仍然在庫中。這有什麼理由嗎?我該如何使用這個blob?或者我該如何刪除它?

回答

7

Whee花了一分鐘,以瞭解你問什麼:)

的Git至少在一段時間內保存所有一切。如果您運行

git fsck 

您應該看到

dangling blob f2... 

這混帳的設計,讓未引用的東西坐了一會兒。這個想法是,如果你「哎呀」的東西,文件仍然在那裏被發現。這也是一種「懶惰優化」,在這種情況下,添加內容可以節省作爲內容尋址文件提交的狀態,並且提交內容只是構建對這些內容的引用。清理部分是分開的。您應該查看git prunegit gc的文檔。

默認情況下,它會在至少2周後發生的git gc運行中得到清理。另外,在積極清理的情況下,git reflog(通常用於打撈提交和重新綁定所有東西)的實用程序將會丟失。

+0

啊哈,真好!我甚至可以用「git show f2 ...」獲得這個blob – alex2k8

相關問題