[GIT] Reset - Aula 7
Reset
O comando Reset é usado para desfazer alterações no histórico do repositório, pode ser usado para remover commits, modificar a Staging Area, ou alterar a posição do ponteiro HEAD
para um commit anterior.
Como fazer um Reset
Soft
O Reset soft é usado para desfazer commits recentes, mas mantém as alterações na Staging Area, seria uma espécie de CRTL + Z (desfazer), mas mantendo o que foi desfeito pronto para ser reutilizado.
Ele basicamente irá mover o ponteiro HEAD
para um Commit anterior, desfazendo as mudanças Commitadas, e movendo elas para Staging Area, deixando-as prontas para serem Commitadas novamente.
git reset --soft Commit_Hash
Caso não queira digitar a Hash do Commit, Você pode usar o HEAD
seguido por um número de passos para voltar no histórico:
git reset --soft HEAD~1
Exemplo:
A -> B -> C (HEAD)
Vamos supor que o Commit "C" foi enviado com alterações erradas, e precisamos modificar algumas coisas que foram Commitadas.
Executamos:
git reset --soft C_Hash
ou
git reset --soft HEAD~1
Após a execução do comando, o ponteiro que antes estava em "C", agora retorna para "B", e as alterações de "C" ficarão na Staging Area, para que sejam corrigidas e Recommitadas.
O que acontece com "C"?
Podemos pensar erroneamente que "C" é deletado imediatamente, entretanto o que realmente acontece é o desreferenciamento.
Desreferenciamento: A partir do momento em que você move o ponteiro para o Commit "B", o Commit "C" não está mais referenciado por nenhuma Branch, Isso significa que "C" se torna um Commit órfão.
O commit "C" permanecerá no repositório até que o Git faça um Garbage Collection, que pode ocorrer automaticamente de tempos em tempos ou quando você a força manualmente com git gc
. Durante essa operação, o Git remove Commits órfãos que não estão referenciados por nenhuma Branch, Tag ou outro objeto.
Obs: Se você quiser recuperar o commit "C" antes que ele seja excluído pelo Garbage Collector, você pode fazê-lo usando o git reflog
.
Hard
O Reset hard é o oposto do soft, ele não apenas move o ponteiro HEAD
para um commit anterior, mas também desfaz todas as mudanças feitas nos arquivos e na Staging Area, ou seja, ele retornará tudo para a forma que estava antes do Commit, deletando todas as alterações e arquivos.
Obs: O Reset hard apaga as alterações marcadas como Unstaged, mas não as alterações Untracked.
Para fazer um Reset hard use:
git reset --hard Commit_Hash
ou
git reset --hard HEAD~1
Cuidado
Conforme dito anteriormente, o Reset hard irá apagar todas as alterações feitas pelo Commit, assim sendo, certifique-se de que você realmente não precisa dessas mudanças, sempre execute git status
para garantir que não há alterações importantes que você ainda queira salvar.
Obs: Em caso de emergência, ainda é possível recuperar as alterações por meio de Reflog.
Mixed
Como o nome sugere, o Reset mixed é um misto entre soft e hard. Ele irá mover o ponteiro HEAD
para o Commit especificado, restaurando o estado do diretório de trabalho, mas sem tocar nos arquivos não Commitados da Staging Area.
Para fazer um Reset mixed use:
git reset --mixed Commit_Hash
ou
git reset --mixed HEAD~1
Ao executar o comando, as alterações do Commit são removidas da Staging Area, ou seja, os arquivos vão para o estado de Unstaged.
Resumindo
--soft: Move o HEAD
para o commit especificado e mantém as mudanças tanto na Staging Area quanto no diretório de trabalho. Ou seja, você pode facilmente commitá-las.
--mixed: Move o HEAD
para o commit especificado, remove as mudanças da Staging Area, mas as mantém no diretório de trabalho.
--hard: Move o HEAD
para o commit especificado e descarta todas as mudanças, tanto na Staging Area quanto no diretório de trabalho.