Когда именно git удаляет объекты: почему «git gc» не удаляет коммиты?
Я работаю над git курсом и хотел бы упомянуть, что потерянные реферы действительно не теряются до запускаgit gc
, Но проверив это, я обнаружил, что это не так. Даже после бегаgit gc --prune=all --aggressive
потерянные рефери все еще там.
Я явно что-то не так понял. И прежде чем сказать что-то неправильное в курсе, я хочу разъяснить свои факты! Вот пример сценария, иллюстрирующий эффект:
#!/bin/bash
git init
# add 10 dummy commits
for i in {1..10}; do
date > foo.txt
git add foo.txt
git commit -m "bump" foo.txt
sleep 1
done;
CURRENT=$(git rev-parse HEAD)
echo HEAD before reset: ${CURRENT}
# rewind
git reset --hard HEAD~5
# add another 10 commits
for i in {1..10}; do
date > foo.txt
git add foo.txt
git commit -m "bump" foo.txt
sleep 1
done;
Этот скрипт добавит 10 фиктивных коммитов, сбросит до 5 коммитов в прошлом и добавит еще 10 коммитов. Непосредственно перед сбросом он напечатает хеш текущего заголовка.
я мог быожидать потерять объект вCURRENT
после запускаgit gc --prune=all
, Тем не менее, я все еще могу бежатьgit show
на этот хэш.
Я понимаю, что после запускаgit reset
и добавив новые коммиты, я по сути создал новую ветку. Но моя оригинальная ветка больше не имеет ссылки, поэтому она не отображается вgit log --all
, Полагаю, он также не будет перенесен на любой пульт.
Мое пониманиеgit gc
было то, что удаляет эти объекты. Это не похоже на случай.
Зачем? А такжекогда точнееgit gc
удалить объекты?