Как полностью удалить объединенный пул-запрос?

Я объединил запрос на 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}

Затем Силовой толчок

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