Git reset suave vs difícil

Você pode desfazer o git reset --hard apenas se tiver feito um commit de todas as alterações antes de redefinir. Não é algo que você queira fazer, a menos que sua árvore de trabalho esteja estragada (por exemplo, devido a uma mesclagem danificada ou uma pesquisa e substituição global que deu errado) que você deseja jogar fora e voltar a algum estado anterior.

Não há como desfazer completamente o git reset --hard, esse é o motivo, porque você nunca deve usar o git-reset dessa maneira

Somente as alterações na ramificação e HEAD podem ser desfeitas, dessa maneira

git reset --hard # do git reset HEAD @ {1} #undo git stash

Se você fez muitas coisas após o git reset --hard, deve pesquisar seu commit usando reflog

git reflog para HEAD:

git reflog

git reflog para qualquer ramo:

git reflog

Encontre o commit sha e use-o no git reset:

git reset esconderijo

NOTA: Estou usando o git reset normal e o git stash porque a reinicialização normal é segura e preserva o conteúdo da cópia de trabalho; o stash permite que você limpe o wc, redefinindo-o para HEAD e armazenando o WC, esta é a maneira segura de limpar rapidamente WC (você pode recuperar o WC usando o git stash pop)

Portanto, evite usar git reset --hard, use git reset; esconderijo

TL; DR

Plug vergonhoso, mas acabei de escrever um artigo sobre Medium, então

Estou te enviando direto para lá

para uma resposta detalhada.

Resposta adequada

Para fazer a reinicialização completa, você deve usar o git reflog.

O novo registro é como um Big Brother do seu fluxo de trabalho. Ele assiste todos os seus passos!

Abrir reflog pela primeira vez é semelhante a descobrir o quanto o Google sabe sobre você. É meio assustador, mas abre os olhos e muitas vezes salva vidas. Você provavelmente está ciente do fato de que o git conhece seu histórico de consolidação - ele foi construído para esse fim. Mas eu encorajo você a correr:

git reflog

Estranho né? Bem, pelo menos quando você está trabalhando em um projeto com outras pessoas, deve haver muito puxar, mesclar, rebasear, clonar e alternar entre ramificações aqui. Tudo o que você fez com suas alterações confirmadas, você pode encontrar nesse reflog. Se você está lendo isso depois de atrapalhar algo importante, provavelmente pode ver algumas linhas abaixo.

No reflog, você pode ver o ponteiro HEAD atual, com um deslocamento para a ação git específica que você fez. Qual é o ponteiro HEAD?

HEAD é um ponteiro ou uma referência para a última confirmação na ramificação com check-out no momento.

Por exemplo, HEAD @ {0} é o mesmo que HEAD, mas você provavelmente pode ver que o momento mais recente, quando tudo estava bem, provavelmente tem um deslocamento maior que isso. E é tudo o que você precisa saber para resolver esse problema!

Agora, basta escolher um ponto no histórico de reflog, para o qual você gostaria de voltar, sair do reflog (simplesmente digitando q) e execute:

E isso é tudo! Agora você está de volta naquele momento que escolheu. Muito legal, não é?

Espero que esteja satisfeito com a resposta! Para uma leitura mais aprofundada sobre esse tópico, recomendo que você verifique

esse meu artigo

, porque vai mais além no tópico.