Когда вы запускаете git reset
, если у вас есть извлеченная ветвь, то эта ветвь переместится в целевой коммит.Любые другие ветки (или любые другие ссылки) останутся без изменений (а старые коммиты останутся в общей истории).Если при запуске git reset
вы находитесь в состоянии отсоединенного HEAD, тогда ветвь не извлекается и ветвь не перемещается.
По умолчанию git показывает только достижимые коммиты.Я не уверен, какая команда показывает вам, что коммиты все еще существуют, но в большинстве случаев тот факт, что они показываются, будет означать, что ссылка все еще указывает на них - и это одна из причин, по которой gc
не поможет.
Существует несколько типов ссылок, которые могут поддерживать коммиты "живыми".
Даже если локальная ветвь переместилась (и была единственной ветвью), может быть соответствующая ссылка для удаленного отслеживания - будет, если ветвь является общей для удаленного.Это вызывает дополнительные проблемы, хотя (см. Ниже).Также могут быть теги или несколько более непонятных вещей.
Поскольку наиболее вероятной проблемой является удаленное отслеживание ссылки, важно понимать, что удаление коммитов из истории ссылки называется «перезаписью истории»,и что перезапись истории совместно используемой ветви имеет свои затраты.Это описано в документации git rebase
в разделе «восстановление после восходящей версии».(Хотя задокументировано, что это связано с rebase, на самом деле это относится ко всем перезаписям.)
Если есть удаленная ветвь отслеживания, которую необходимо переместить, и если вы решите продолжить переписывание историинесмотря на затраты на это, вы должны принудительно обновить удаленную ветку (и ссылку на удаленное отслеживание).
git push --force-with-lease
Важно, чтобы перезапись истории была связана / скоординирована свсе остальные пользователи репо;если они предпринимают неправильные действия при попытке восстановления, это может отменить переписывание истории.
После перемещения всех ссылок большинство команд не будут отображать «удаленные» фиксации, но они все еще физически существуют.На самом деле, они по-прежнему не будут сразу иметь право на gc
, потому что в вашем локальном репо есть набор «reflogs», которые отслеживают историю каждой ветви, а также символический ref HEAD
.Так что, если у вас были зафиксированы коммиты, или если какая-либо ветка включила их, то соответствующие reflogs можно использовать для их восстановления даже после того, как ветка и другие ссылки были перемещены.Это означает, что коммиты еще не могут быть физически удалены.
Вы можете привести к истечению срока действия reflogs (или удалить сами файлы reflog);см. git reflog
документы.Или вы можете подождать, пока срок действия reflogs истечет самостоятельно.После этого коммиты будут удалены.
Однако, в зависимости от того, как размещен пульт, может потребоваться отдельная процедура для удаления коммитов из его копии базы данных.И вы абсолютно ничего не можете сделать, чтобы заставить других пользователей физически отказаться от этих коммитов от своих клонов.Таким образом, если удаление информации из репозитория важно, вам понадобится сотрудничество с клоном;и если причины удаления коммитов заключаются в том, что они содержат конфиденциальную информацию, то вам следует учитывать, что эта информация скомпрометирована (например, путем изменения любых паролей, которые были раскрыты таким образом, и т. д.).