2014-09-26 4 views
1

Я хотел бы навсегда удалить указанные коммиты из всей истории репозитория git. Я видел this thread, в котором рекомендуются следующее:remove commits (forever) from git history

git reset --hard HEAD~4 
git push origin HEAD --force 

Это нормально, и перезагружает статус моего хранилища, но никоим образом не удалить мои фиксации. Я хотел бы буквально отбросить историю и отказаться от изменений в репо с 4 пересмотров назад.

Может ли кто-нибудь помочь мне с этим? Когда я попробую выше и посмотрю историю изменений в Github, я все еще вижу нежелательные коммиты, сидящие там.

Я видел this article, но я хотел проверить, были ли другие варианты перед исследованием этого решения.

+0

Вы пишете: * никоим образом не удаляет мои коммиты *. Комиты, которые вы пытаетесь избавиться, могут быть частью предков других ссылок. – Jubobs

+0

Мне должно было быть ясно - я имею дело только с мастер-веткой, и никакой другой автор не участвовал в совершении. – jml

+0

Хорошо, но в каком смысле эта команда * никоим образом не удаляет [ваших] коммит *? Вы все еще можете видеть их в выводе 'git log'? В вашем удаленном репо? Или вы имеете в виду что-то еще? – Jubobs

ответ

1

Вашего вопроса, что на самом деле происходит, когда вы запускаете

git push origin HEAD --force 

неясен, но я думаю, что по крайней мере по двум причинам, почему это может не заставить нажатие master к origin:

  1. Филиал проверен в настоящее время неmaster и является филиалом, который уже обновлен на origin, или
  2. у вас есть de tached HEAD.

Удостоверяются, что master действительно является в настоящее время проверенной веткой ou, пробег git checkout master; затем выполните команду принудительного нажатия. С другой стороны, указать master явно в команде git push:

git push --force origin master 

Это должно сделать это.

1

Если нежелательные коммиты больше не ссылаются на ветку или тег (т. Е. Называемые «свободные объекты»), они автоматически удаляются сборщиком мусора. По умолчанию GC действует на объекты старше 90 дней.

Вы все еще можете вручную запустить ранее GC с:

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

Однако, что будет действовать только на локальном хранилище, а не на GitHub. GitHub запускает недельный GC со своими собственными опциями, поэтому, если вы хотите удалить коммиты сейчас, вам придется удалить репозиторий, воссоздать его и нажать локальный после очистки GC.