Как полностью удалить объединенный пул-запрос?
Я объединил запрос на GitHub. Однако это было ошибкой, и я хочу отменить слияние, его коммиты и, самое главное, удалить все файлы, представленные этими несколькими коммитами из истории.
Я вернул коммит другому, и он работает, но файлы все еще находятся в истории коммитов (они большие), и было бы неплохо, если бы сами коммиты исчезли.
Я попытался отфильтровать ветвь, удалив файлы, но это, похоже, не уменьшает размер хранилища (и коммиты все еще там).
Что я должен делать?
5 ответов
Использование древовидного фильтра или индексного фильтра не сработало. Хард ресет и перепаковка тоже не сделали.
Вот что сработало:
git checkout <commit>
git push --force origin HEAD:master
Теперь мне интересно, почему эти решения не сработали. Я проверял, используя размер пакета в git count-objects -v
, Это правильно? Должен ли я увидеть уменьшение размера сразу или только после нажатия на начало координат?
Удалить слияние и коммиты с
git reset --hard <sha1>
как описано @knittl. Однако вы не увидите никаких изменений в размере своего хранилища, пока не удалите связанные висячие объекты. Вы также должны прекратить использование reflog, чтобы сохранить ссылку на эти объекты, например:
git reflog expire --expire-unreachable=now --all
git prune
git repack -a -d
Если вы просто хотите удалить слияние и связанные с ним коммиты, используйте git reset --hard
:
git reset --hard <commit before merge>
Обратите внимание, что это уничтожит любые незафиксированные изменения в вашей текущей HEAD. Он также удалит все коммиты, которые произошли после слияния (так что, возможно, вам лучше использовать git rebase).
После сброса ветки нажмите и удерживайте ее, чтобы сохранить новую историю.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Это плохая практика, чтобы переписать уже опубликованную историю. Не делай этого, если не нужно.
Отмена фиксации не удалит файлы из истории.
Если вы хотите, чтобы файлы не только не существовали в текущем HEAD, но и никогда не существовали вообще, git revert
не правильная команда для вас. Вам нужно запустить filter-branch
полностью удалить эти файлы.
Вы сказали, что уже сделали это, но вы не показываете нам, как; если вы правильно сделаете следующее:
git filter-branch --tree-filter
удалить файлыgit reflog expire --expire={1 second}
rm -rf .git/refs/original
git gc
... тогда хранилище должно сжаться. Вам нужны последние три шага, потому что (по порядку):
- Оригинальные коммиты доступны через ваш reflog
- Ссылки на оригинальные коммиты хранятся
filter-branch
вrefs/original
- Пока вы не запустите сборку мусора, "свободные" объекты не удаляются
С моей точки зрения, лучший способ — использовать Git Reflog:
git reflog
Проверьте, какая точка для вас лучше всего, и двигайтесь туда:
git reset --hard HEAD@{124}
Затем Силовой толчок