Как очистить неиспользуемые боковые ветки в деревьях фиксации?

Как бы вы очистили неиспользуемые боковые ветки в деревьях фиксации (а не вещественные ветки git)?

Пример (дерево, fake-commit-hash, сообщение фиксации, необязательный [указатели]):

*    0001 last commit [master] [origin/master] [HEAD]
| *  0002 old, unused merge
|/|
* |  0003 some remote commits
* |  0004 another commit from remote
| *  0005 old, unused commits
|/
*    0006 old tree

Путь 0001, 0003, 0004, 0006 должен оставаться нетронутым, но коммиты 0002 и 0005 не полезны и не приносят никакой пользы. Как удалить коммиты 0002 и 0005?

Ответы

Ответ 1

tarsius написал в ответе на другой вопрос:

git reflog expire --expire=now --all
git gc --prune=now

который очищает reflog, а затем очищает репозиторий. Очистка reflog сначала не всегда работает, потому что значения, зафиксированные с помощью reflog, сохраняются в режиме git-gc до тех пор, пока reflog не истечет (это по умолчанию 90 дней).

После этого все оборванные коммиты действительно исчезли, насколько я понял. Поэтому нужно быть уверенным, что им действительно больше не нужны все. Если кто-то действительно хочет сохранить некоторые из оборванных коммитов, можно:

git checkout <dangling_commit_id>
git branch <new_branch_name_of_your_choice>

или используйте git format-patch, чтобы сохранить всю фиксацию в текстовом файле.