Ao trabalhar com o Git, você descobrirá que às vezes os commits precisam ser removidos porque introduziram um bug ou precisam ser retrabalhados.
Se for o último commit é muito direto. Simplesmente execute:
git reset HEAD^
Isso irá mostrar o último commit, mas deixará todas as suas alterações nos arquivos intactas.
Se você precisa deletar mais do que apenas o último commit, existem dois métodos que você pode usar. O primeiro é usar o rebase, o que permitirá que você remova um ou mais commits consecutivos; o outro é escolhido a dedo, que permite remover commits não consecutivos.
Exemplo de log git
Número | Hash | Mensagem de confirmação | Autor |
---|---|---|---|
1 | 2c6a45b | (HEAD) Adicionando método público para acessar o método protegido | Tom |
2 | ae45fab | Atualizações na interface do banco de dados | Contratante 1 |
3 | 77b9b82 | Melhorando a interface do banco de dados | Empreiteiro 2 |
4 | 3c9093c | Ramificação de desenvolvimento mesclada em mestre | Tom |
5 | b3d92c5 | Adicionando novo módulo Event CMS | Paul |
6 | 7feddbb | Adicionando classe CMS e arquivos | Tom |
7 | a809379 | Adicionando projeto ao Git | Tom |
Usando Rebase
Usando o log do git acima, queremos remover os seguintes commits; 2 & 3 (ae45fab & 77b9b82). Como são commits consecutivos, podemos usar rebase.
git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name>
por exemplo, para remover commits 2 & 3 acima
git rebase --onto repair~3 repair~1 repair
Usando o Cherry Pick
Etapa 1: Encontre o commit antes do commit você deseja remover git log
Etapa 2: verificar esse commit git checkout <commit hash>
Etapa 3 : Faça um novo branch usando seu commit de checkout atual git checkout -b <new branch>
Etapa 4: Agora você precisa adicionar o commit após o commit removido git cherry-pick <commit hash>
Passo 5: Agora repita o Passo 4 para todos os outros commits que deseja manter.
Passo 6: Uma vez que todos os commits foram adicionados ao seu novo branch e foi cometido. Verifique se tudo está no estado correto e funcionando conforme planejado. Verifique se tudo foi confirmado: git status
Etapa 7: Mude para o seu branch quebrado git checkout <broken branch>
Etapa 8: agora execute uma reinicialização a frio no branch quebrado para o commit antes daquele que você deseja remover git reset --hard <commit hash>
Etapa 9: mescle seu ramificação corrigida para esta ramificação git merge <branch name>
Etapa 10: Empurre as alterações mescladas de volta à origem. AVISO: isso substituirá o repositório remoto! git push --force origin <branch name>
Você pode fazer o processo sem criar um novo branch, substituindo a Etapa 2 & 3 pela Etapa 8, em seguida não realizar a Etapa 7 & 9.
Exemplo
Digamos que queremos remover os commits 2 & 4 do repo.
-
git checkout b3d92c5
Verifique o último commit utilizável. -
git checkout -b repair
Crie um novo branch para trabalhar. -
git cherry-pick 77b9b82
Execute o commit 3. -
git cherry-pick 2c6a45b
Executar o commit 1. -
git checkout master
Check-out mestre. -
git reset --hard b3d92c5
Redefina o master para o último commit utilizável. -
git merge repair
Una nosso novo branch no master. -
git push --hard origin master
Envie o mestre para o repositório remoto.
Nota final
Rebase Git & cherrypick são perigosos, mas poderosos soluções que devem ser usadas apenas como uma última opção e só ser realizada por alguém que sabe o que está fazendo. Esteja ciente de que ambas as soluções podem ter efeitos adversos em outros usuários que estão trabalhando no mesmo repositório / branch.
Finalmente, lembre-se de ter cuidado e boa sorte!