Git - сохраняются ли исправленные коммиты?
В моей ветке Git я создал коммит и нажал. позже я добавил изменения в индекс, использовал git commit --amend
, а потом git push -f
, Мой новый коммит заменил первый как локально, так и удаленно в моей ветке.
На этом этапе я бы ожидал (или хочу), чтобы исходный коммит больше не существовал или, по крайней мере, не существовал (возможно, в reflog), но больше не имел родителя, поэтому после запуска GC он перестанет существовать, Тем не менее, кажется, что коммит все еще там, и его родитель все еще не поврежден. (В этом случае я узнал об этом через Jira, который связал меня с моими переопределенными коммитами на github)
Почему это так? Как это будет удалено? Означает ли это, что всякий раз, когда я случайно нажимаю пароль на GitHub, а затем использую git commit --amend
или же git reset
, а потом git push -f
коммиты никогда не будут действительно удалены?
2 ответа
От git help gc
:
--prune=<date>
Удалите незакрепленные объекты старше даты (по умолчанию 2 недели назад, которую можно переопределить с помощью переменной конфигурации gc.pruneExpire).
--prune=all
чернослив незакрепленных предметов независимо от их возраста.--prune
включен по умолчанию.
Так что вы, вероятно, хотите запустить git gc --prune=all
,
Git 2.7 (4 квартал 2015 года) вводит предупреждение о " git gc --prune=all
"
Смотрите коммит fae1a90 (14 октября 2015 г.) от Junio C Hamano ( gitster
)
(Объединено Юнио С Хамано - gitster
- в коммит ce555f3, 20 октября 2015 г.)
Documentation/gc
: предупредить о--prune=<now>
"
git gc
"безопасен для запуска в любое время только потому, что имеет встроенный льготный период для защиты объектов, созданных другими процессами, которые ожидают обновления ref для привязки их к истории.
Чтобы запустить без льготного периода, пользователь должен убедиться, что хранилище находится в состоянии покоя.
quiescent: уже упоминалось на странице руководства пользователя git:
Вы должны только бежать
git prune
в неподвижном репозитории - это похоже на работу с файловой системойfsck
восстановление: вы не хотите делать это, пока смонтирована файловая система.
Таким образом, состояние покоя означает состояние или период бездействия или покоя.
Новый документ упоминает:
--prune=all
чернослив свободные предметы независимо от их возраста
(не используйте--prune=all
если вы точно не знаете, что делаете.
Если репозиторий не находится в состоянии покоя, вы потеряете вновь созданные объекты, которые не были привязаны к ссылкам, и в конечном итоге повредите ваш репозиторий).--prune
включен по умолчанию.