Несколько «git add» перед «git commit» - PullRequest
2 голосов
/ 27 августа 2009

Вот мои эксперименты.

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.

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

1 Ответ

7 голосов
/ 27 августа 2009

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

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

git fsck

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

dangling blob f2...

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

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

...