Eu sei que Git rastreia as mudanças que eu faço na minha aplicação, e se agarra a elas até eu cometer as mudanças, mas aqui's onde eu'm desliguei:
Quando eu quero voltar a um compromisso anterior que uso:
git reset --hard HEAD
E o Git regressa:
HEAD is now at 820f417 micro
Como faço para reverter os arquivos no meu disco rígido de volta àquele commit anterior?
Os meus próximos passos foram:
git add .
git commit -m "revert"
Mas nenhum dos ficheiros mudou no meu disco rígido...
O que estou a fazer bem/mal?
Primeiro, vale sempre a pena notar que git reset --hard
é um comando potencialmente perigoso, uma vez que joga fora todas as suas alterações não comprometidas. Por segurança, você deve sempre verificar se a saída do git status
está limpa (ou seja, vazia) antes de utilizá-la.
Inicialmente você diz o seguinte:
Por isso sei que Git rastreia as mudanças que faço na minha aplicação, e se agarra a elas até eu cometer as mudanças, mas aqui é onde estou pendurado:
Isso é incorrecto. Git apenas grava o estado dos arquivos quando você os encena (com git add') ou quando você cria um commit. Uma vez que você criou um commit que tem seus arquivos de projeto em um estado particular, eles estão muito seguros, mas até lá o Git não está realmente "rastreando mudanças" em seus arquivos. (por exemplo, mesmo que você faça
git add` para encenar uma nova versão do arquivo, que sobrescreve a versão previamente encenada desse arquivo na área de encenação).
Na sua pergunta, você então vai em frente para perguntar o seguinte:
Quando eu quero voltar a um compromisso anterior eu uso: git reset --hard HEAD E git retorna: HEAD está agora em 820f417 micro
Como faço para reverter os arquivos no meu disco rígido de volta àquele commit anterior?
Se você fizer git reset --hard <SOME-COMMIT>
então Git irá:
master
) voltar a apontar para <SOME-COMMIT>
.O HEAD' aponta para o seu ramo atual (ou commit atual), então tudo que o
git reset --hard HEAD' fará é jogar fora quaisquer alterações não comprometidas que você tenha.
Então, suponha que o bom compromisso ao qual você quer voltar é f414f31
. (Você pode encontrar isso via git log
ou qualquer navegador de histórico.) Você então tem algumas opções diferentes, dependendo exatamente do que você quer fazer:
Mude o seu ramo actual para apontar para o compromisso mais antigo em vez disso. Você poderia fazer isso com git reset --hard f414f31'. No entanto, isto está reescrevendo o histórico do seu ramo, então você deve evitar isto se você compartilhou este ramo com alguém. Além disso, os commits que você fez após o
f414f31' não estarão mais no histórico do seu ramo `master'.
Crie um novo commit que represente exatamente o mesmo estado do projeto do `f414f31', mas apenas acrescente isso ao histórico, para que você não perca nenhum histórico. Você pode fazer isso utilizando os passos sugeridos em esta resposta - algo como:
git reset --duro f414f31
git reset --soft HEAD@{1}
git commit -m "Reverting to the state of the project at f414f31" (Revertendo para o estado do projeto em f414f31)
WARNING: `git clean -f' removerá os arquivos não rastreados, o que significa que eles desapareceram para sempre, uma vez que não estão armazenados no repositório. Certifique-se de que você realmente quer remover todos os arquivos desempilhados antes de fazer isso.
Experimente isto e veja o git clean -f
.
O git reset --hard' não removerá arquivos não rastreados, onde como o
git-clean' removerá quaisquer arquivos do diretório raiz rastreado que não estejam sob o rastreamento do Git.
Alternativamente, como @Paul Betts disse, você pode fazer isso (cuidado, porém - isso remove todos os arquivos ignorados também)