A maneira padrão de fazer isso é com git-filter-branch . Isso permite percorrer um histórico de commits e reescrever cada um deles de alguma forma. No seu caso, digamos que você tenha cometido, acidentalmente, passwords.txt e precise removê-lo do seu histórico.
O comando que você executaria pode ser parecido com isto:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch passwords.txt' HEAD
Peça por peça:
-
git filter-branch: reescrever o histórico. -
--index-filter: Para cada consolidação, queremos alterar o índice de alguma forma e depois reconfigurá-lo. -
'git rm --cached --ignore-unmatch passwords.txt': para cada confirmação, altere o índice executando estegit-rmcomando. Isso remove qualquer arquivo chamadopasswords.txtdo índice. -
HEAD: reescreva o histórico da filial atualmente com check-out.
Quando terminar, você terá um novo commit verificado com histórico idêntico, exceto pela falta de passwords.txt . Como você reescreveu o histórico, é necessário avisar de alguém que compartilhe o repositório de você que ele deve se recuperar de seu rebase upstream .
Por exemplo, se o seu histórico se parecesse com isso, e comete B-C estavam contaminados:
A ---- B ---- C ---- D ---- E
Quando terminar, seu histórico será agora assim:
A
\
B' ---- C' ---- D' ---- E'
Observe que D e E foram reescritos para D 'e E'. Eles podem apontar para as mesmas árvores, mas desde que a história mudou, eles terão novos IDs de commit e serão considerados novos commits no que diz respeito ao Git.
Mais informações sobre como usar git-filter-branch podem ser encontradas na seção "Reescrevendo o Histórico" do livro Pro Git