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-rm
comando. Isso remove qualquer arquivo chamadopasswords.txt
do í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