Quinta, 22 Dezembro 2011 15:14

Como remover um Commit indesejado no GIT

Written by 
Rate this item
(0 votes)

Bem, quem trabalha com controle de versão sabe como é chato descobrir que enviou para o repositório algo indesejado, pior ainda quando é algo que não gostaria que ficasse no histórico do repositorio de forma publica como um arquivo de configuração com sua senha.

E não é simplesmente o fato de se remover o arquivo no próximo commit, pois isto não irá remover o arquivo do histórico.

Vou mostrar neste artigo uma forma que pode ajudar a resolver este problema, não é uma solução simples para todos os casos, mas ajuda bastante.

Bem a solução é baseado no recurso chamado rebase, onde se reconstrõe a estrutura do repositorio removendo um determinado commit e executando o merge do commit anterior com o próximo commit na estrutura.

Para tal atividade você precisa identificar os Hash de identificação do Commit que se deseja remover e de seu antecessor, ou seja do commit que vem logo após ele.

Para isto use o comando "git status" e encontre o commit que deseja remover veja na figura abaixo:

git-rebase-git-log-1

Bem, o commit que pretendo remover é o commit de hash: be535720827d0caea009bb8faae993ee6d1d595c

E pretendo substituí-lo com base no commit de hash: c82b7f44f8d66343b6553cbf15fe40e1c6f6cd4b que é seu antecessor.

Patrocinador

Para isto devemos usar o comando git-rebase no fomato: git rebase --onto <rev antecessora> <rev a remover>

Ficando o comando da seguinte forma: 

 

git rebase --onto c82b7f44f8d66343b6553cbf15fe40e1c6f6cd4b be535720827d0caea009bb8faae993ee6d1d595c

git-rebase-git-rebase--onto

Neste caso o processo ouve um conflito visto que o arquivo teste 3 foi deletado no HEAD e modificado durante o processo de commit, desta forma é preciso intervir manualmente. Caso o merge do rebase possa ser feito automaticamente nenhum outro comando é necessário, mas neste caso é preciso tomar uma dos 3 caminhos:

  1. Resolver manualmente o conflito, executar o "git add ." e executar o comando "git rebase --continue"
  2. Ignorar o conflito e deixar o path para traz executando o comando "git rebase --skip"
  3. Efetuar o check out do branch original e parar o processo de rebase com o comando "git rebase --abort"

 

Read 560 times Last modified on Sexta, 23 Março 2012 21:39

Leave a comment

Make sure you enter the (*) required information where indicated. HTML code is not allowed.

Pesquisar

Usar Perfil do Facebook

Cursos Virtuais

Blogger