Удалить/отключить Git ревизию/историю фиксации
У меня есть проект, который содержит следы другого проекта, который я использовал как своего рода проект шаблона. Теперь я хочу полностью удалить эти трассы из репозитория. В принципе, я хочу отрезать старые коммиты. Так что я
A -- B -- C -- D -- E -- F
и хотите получить что-то вроде
D -- E -- F
при этом A -- B -- C
полностью удаляется из хранилища.
Ответы
Ответ 1
Предполагая, что master
находится на фиксации F
:
# create a new branch with D content
$ git checkout --orphan temp <d-sha1>
$ git commit
# rebase everything else onto the temp branch
$ git rebase --onto temp <d-sha1> master
# clean up
$ git checkout master
$ git branch -d temp
Если вы хотите полностью удалить старые свободные объекты (A
, B
, & C
), сначала убедитесь, что у вас есть именно то, что вы хотите. Это не может быть отменено. Как только вы подтвердите это, вы хотите запустить:
$ git reflog expire --expire=now --all
$ git gc --prune=now
Ответ 2
В Github есть хорошая статья об удалении конфиденциальных данных (так что вы тоже этого хотите):
Удаление чувствительных данных от Git
Ответ 3
Пытался следовать ответу @vergenzt, но git начал применять патчи с 1-го коммита, который был 3000+, до того, с которого мне нужно было начать.
Моей целью было сделать меньшее репо для нового проекта, основанного на текущем. К сожалению, мне нужно было сохранить историю из текущего проекта (несколько месяцев). Вот как мне наконец удалось это сделать:
Инструмент командной строки был не совсем удобен для этого, потому что вам нужно будет разрешать конфликты. К счастью, в TortoiseGit есть функция Rebase, где вам нужно предоставить 2 блока: master (слева) и temp (справа). Затем пропустите все коммиты до того, где ваша временная ветвь включает коммит (выберите коммиты и используйте "пропустить" в меню правой кнопки мыши). После запуска rebase вы получите некоторые конфликты, которые вы можете разрешить прямо в GUI rebase. Я всегда выбирал "использовать версию мастер ветки" в меню правой кнопки мыши. Это заняло гораздо меньше времени, чем работа с CLI. После того, как все было сделано, я дополнительно скопировал все файлы проекта из последней версии исходного репозитория на файлы в новом репозитории (перезаписать все), чтобы убедиться, что ничего не потеряно. У меня есть только несколько файлов, которые были в .gitignore и почему-то не были проигнорированы. Другие файлы были такими же.
Я надеюсь, что это помогает кому-то.