Чтобы изменить порядок фиксации истории, существует несколько способов.
Проблема с rebase
, когда вы хотите изменить историю всего репо, состоит в том, что она перемещает только одну ветку за раз. Кроме того, у него есть проблемы, связанные со слияниями, поэтому вы не можете просто перебазировать D
и E
на A
, сохраняя более свежую историю, как она существует сейчас (потому что E
- это слияние).
Вы можете обойти все это, но метод сложен и подвержен ошибкам. Существуют инструменты, предназначенные для переписывания с полным репо. Возможно, вы захотите взглянуть на filter-repo
(инструмент, который заменяет filter-branch
), но похоже, что вы просто пытаетесь удалить частичный файл из своей истории, что (1) может быть хорошей работой для репозитория BFG Очистить, или (2) на самом деле достаточно простая задача с filter-branch
(Если вы хотите посмотреть на BFG, https://rtyley.github.io/bfg-repo-cleaner/; если вы хотите посмотреть на filter-repo
, https://github.com/newren/git-filter-repo)
Для использования filter-branch
для этой цели
git filter-branch --index-filter 'git rm --cached --ignore-unmatch path/to/file' --prune-empty -- --all
Однако - вы указали, что файл нужен не быть в репо (в противовес чьему-либо предложению просто удалить его из следующего коммита). Так что вам нужно понять, что git не так легко отдает информацию. После использования любого из этих методов вы все равно можете извлечь файл из репозитория.
Это своего рода большой топи c, который обсуждался несколько раз в различных вопросах / ответах по SO, поэтому я предлагаю поискать то, что вам действительно нужно спросить: как навсегда удалить файл, который никогда не должен был находиться под контролем исходного кода.
Несколько замечаний:
1 - если есть пароли и они когда-либо были отправлены на общий пульт, эти пароли скомпрометированы. Вы ничего не можете с этим поделать; смените пароли.
2 - Каждый репо (удаленный и каждый клон) должен быть преднамеренно очищен или выброшен и заменен. (Тот факт, что вы не можете заставить кого-то сделать это, если он не хочет сотрудничать, является одной из причин (1).)
3 - В местном репо, где вы производили ремонт, Вы должны избавиться от повторных журналов (а также резервных ссылок, которые могли быть созданы, если вы использовали инструмент, такой как filter-branch
), а затем запустить gc
. Либо может быть проще повторно клонировать новый репо, который извлекает только новые версии ветвей.
4 - Очистка пульта дистанционного управления может даже оказаться невозможной, в зависимости от того, как он размещен. Иногда лучшее, что вы можете сделать, это сбросить пульт, а затем воссоздать его с нуля.