2009-08-27 8 views
2

Вот мои эксперименты.Несколько «git add» перед «git commit»

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") 

Как мы можем видеть каждый «мерзавец добавить» созданный объект блоб, и «мерзавец совершить» совершил последнюю каплю 53.

Но обратите внимание, что промежуточный блоб «f2» все еще находится в хранилище. Есть ли причина для этого? Как я могу использовать этот blob? Или как его удалить?

ответ

7

Whee взял меня минута, чтобы понять, что вы просили :)

Git сохраняет все, по крайней мере, в течение времени. Если вы запустите

git fsck 

Вы должны увидеть

dangling blob f2... 

Это дизайн мерзавца, чтобы сидеть без ссылок вещи на некоторое время. Идея состоит в том, что если вы что-то «упёте», файл все равно там будет найден. Это также «ленивая оптимизация», когда добавление чего-то сохраняет состояние для фиксации в качестве файла с контентом, и что-то компилировать - это просто ссылка на них. Часть очистки является отдельной. Вы должны посмотреть документацию для git prune и git gc.

По умолчанию он будет очищен при некотором запуске git gc, который произойдет не менее чем через 2 недели. Кроме того, утилита git reflog (часто используется для спасения коммитов и переделов, которые ввернули все) будет потеряна в случае агрессивной очистки.

+0

Ага, хорошо! Я даже могу получить этот blob с "git show f2 ..." – alex2k8