Что случилось с коммитом, который не отображается ни в одной ветке, но доступен в "git show"
У меня есть идентификатор коммита, доступный в голом репо.git show commit id
, показывает коммит с изменениями.
Но тот же коммит не отображается при использовании следующих команд
git branch --contains <commit id>
или же
git reflog show --all | grep <commit id>
Что могло случиться с идентификатором коммита?
3 ответа
Можно создать ветку, зафиксировать ее и затем принудительно удалить ее git branch -D
, В этом случае коммиты теряются таким образом. Reflog показывает журналы существующих ссылок.
Кроме того, ваши команды не проверяют reflog заголовка. Пытаться git reflog show HEAD
, он может содержать коммит (например, если он был превращен в отдельную головку), если он еще не собран мусором.
(Извините за мой предыдущий ответ, полностью не по теме).
git reflog
не будет проходить каждый коммит, если вы git pull
или же git clone
на удаленном, так что, возможно, этот коммит происходит от одной из этих операций.
Кроме того, я полагаю, что вы проверили, что коммиту менее 90 дней, хотя он мог бы быть установлен иначе с настройками gc по умолчанию.
Я считаю, что эти коммиты называются висячими коммитами. git fsck
покажет им. Они все еще существуют в Git-хранилище до git gc
или же git prune
пробеги. В общем-то, git gc
автоматически запустится, когда в репо окажется слишком много потерянных объектов, которые будут упакованы в файл пакета. git gc
операция также удалит фиксированные коммиты до определенного времени. git gc --prune=now
а также git prune --expire=now
удалит эти коммиты немедленно. git config --global gc.auto 0
отключит автоматический запуск gc.