Чтобы удалить все висячие коммиты и те, которые доступны из повторных журналов, сделайте следующее:
git reflog expire --expire-unreachable=now --all
git gc --prune=now
Но будьте уверены, что это то, что вы хотите. Я рекомендую вам прочитать справочные страницы, но вот суть:
git gc
удаляет недоступные объекты (коммиты, деревья, BLOB-объекты (файлы)). Объект недоступен, если он не является частью истории какой-либо ветви. На самом деле все немного сложнее:
git gc
делает некоторые другие вещи, но они здесь не актуальны и не опасны.
Недоступные объекты младше двух недель не удаляются, поэтому мы используем --prune=now
, что означает «удалить недоступные объекты, созданные ранее».
Объекты также могут быть достигнуты через reflog. В то время как ветки записывают историю какого-либо проекта, повторные журналы записывают историю этих веток. Если вы исправляете, сбрасываете и т. Д. Коммиты удаляются из истории веток, но git сохраняет их на случай, если вы поймете, что допустили ошибку. Reflogs - это удобный способ выяснить, какие деструктивные (и другие) операции выполнялись на ветке (или HEAD), что упрощает отмену деструктивной операции.
Таким образом, мы также должны удалить reflogs, чтобы фактически удалить все, что недоступно из ветви. Мы делаем это путем истечения срока действия --all
reflogs. Опять же, git хранит немного reflogs для защиты пользователей, поэтому мы снова должны сказать ему не делать этого: --expire-unreachable=now
.
Так как я в основном использую reflog для восстановления после деструктивных операций, я обычно использую --expire=now
, что полностью сбрасывает reflogs.