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 включен по умолчанию.

Другие вопросы по тегам