Удалить/отключить 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

Ответ 3

Пытался следовать ответу @vergenzt, но git начал применять патчи с 1-го коммита, который был 3000+, до того, с которого мне нужно было начать.

Моей целью было сделать меньшее репо для нового проекта, основанного на текущем. К сожалению, мне нужно было сохранить историю из текущего проекта (несколько месяцев). Вот как мне наконец удалось это сделать:

Инструмент командной строки был не совсем удобен для этого, потому что вам нужно будет разрешать конфликты. К счастью, в TortoiseGit есть функция Rebase, где вам нужно предоставить 2 блока: master (слева) и temp (справа). Затем пропустите все коммиты до того, где ваша временная ветвь включает коммит (выберите коммиты и используйте "пропустить" в меню правой кнопки мыши). После запуска rebase вы получите некоторые конфликты, которые вы можете разрешить прямо в GUI rebase. Я всегда выбирал "использовать версию мастер ветки" в меню правой кнопки мыши. Это заняло гораздо меньше времени, чем работа с CLI. После того, как все было сделано, я дополнительно скопировал все файлы проекта из последней версии исходного репозитория на файлы в новом репозитории (перезаписать все), чтобы убедиться, что ничего не потеряно. У меня есть только несколько файлов, которые были в .gitignore и почему-то не были проигнорированы. Другие файлы были такими же.

Я надеюсь, что это помогает кому-то.