Como desfazer 'git reset'?


1313

Qual é a maneira mais simples de desfazer o

git reset HEAD~

comando? Atualmente, a única maneira de pensar é em fazer um "git clone http: // ..." de um repositório remoto.


2
Se alguém estiver procurando por desfazer uma redefinição por hardware , verifique Desfazendo uma redefinição do git --hard HEAD ~ 1 . As soluções são muito semelhantes.


2
Não é uma duplicata das perguntas relacionadas a --hard! O risco de executar acidentalmente esse comando é muito maior. Por exemplo, você deseja desfazer um único arquivo com git reset foo-file. Você escreve apenas a primeira parte do nome do arquivo, pressiona a guia para o preenchimento automático, na verdade é concluída com o nome de um ramo, você não percebe e executa o comando git reset foo-branch. Voilà
Yushin Washio

Respostas:


2389

Resposta curta:

git reset 'HEAD@{1}'

Resposta longa:

O Git mantém um registro de todas as atualizações de ref (por exemplo, checkout, redefinir, confirmar, mesclar). Você pode vê-lo digitando:

git reflog

Em algum lugar nesta lista está o commit que você perdeu. Digamos que você digitou git reset HEAD~e deseja desfazê-lo. Meu reflog fica assim:

$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]

A primeira linha diz que HEAD0 posições atrás (em outras palavras, a posição atual) é 3f6db14; foi obtido redefinindo para HEAD~. A segunda linha diz que HEAD1 posição atrás (em outras palavras, o estado antes da redefinição) é d27924e. Foi obtido verificando um commit específico (embora isso não seja importante no momento). Portanto, para desfazer a redefinição, execute git reset HEAD@{1}(ou git reset d27924e).

Se, por outro lado, você executou alguns outros comandos desde então que atualizam o HEAD, a confirmação que você deseja não estará no topo da lista e será necessário pesquisar no reflog.

Uma observação final: pode ser mais fácil olhar reflogpara o ramo específico que você deseja restaurar, digamos mestre, em vez de HEAD:

$ git reflog show master
c24138b master@{0}: merge origin/master: Fast-forward
90a2bf9 master@{1}: merge origin/master: Fast-forward
[...]

Isso deve ter menos ruído do que o geral HEAD reflog.


25
Como uma alternativa mais visual e mais agradável reflogpara esse fim, eu gosto de usar git log --graph --decorate --oneline $(git rev-list -g --all). Ele mostra uma árvore de todas as submissões, incluindo balançando ramos sem nome
texasflood

1
Digamos que eu tenha um diretório com arquivos existentes. Neste diretório, eu corro git inite depois disso git reset --hard. Não há reflog, nem mesmo logs para começar. Esses arquivos estão praticamente prontos agora?
AlanSE

@ AlanSE, infelizmente, esses arquivos são torradas, tanto quanto eu sei. Se você nunca fez git add(ou seja, nunca preparou essa versão do arquivo), então git checkoutou git reset --hardexpulsará a única cópia (o diretório de trabalho) sem backup. Eu gostaria que não.
22615 Mark Lodato

2
git reset HEAD~12oops ... git reset HEAD@{12}nãooo .. 'git reflog' para o resgate! Ah, é sógit reset HEAD@{1}
Dennis

Depois de ler o excelente artigo git-scm.com/blog/2011/07/11/reset.html git-reset, fico um pouco menos confuso.
Andriy Drozdyuk

192

Pergunta antiga e as respostas postadas funcionam muito bem. Mas eu vou gritar com outra opção.

git reset ORIG_HEAD

ORIG_HEADreferencia o commit que HEADreferenciou anteriormente.


1
Isso parece ótimo - você seria capaz de elaborar? "ORIG" aqui é a abreviação de "original" ou "origin"? … Ou seja, ele redefine para onde HEAD estava antes de começar a brincar com ele? Ou para onde a HEAD está na origem? O que acontece se você mudou o HEAD várias vezes antes da git reset ORIG_HEAD? Obrigado.
Benjohn

ORIG significa original, ORIG_HEAD significa HEAD original, antes da redefinição
Sam Gallagher

"Certas operações, como mesclagem e redefinição, registram a versão anterior do HEAD em ORIG_HEAD imediatamente antes de ajustá-la para um novo valor. Você pode usar ORIG_HEAD para recuperar ou reverter para o estado anterior ou para fazer uma comparação." Trecho do livro: "Controle de versão com Git"
Amirreza 07/09/19

56

Minha situação era um pouco diferente, eu fiz git reset HEAD~três vezes.

Para desfazer eu tinha que fazer

git reset HEAD@{3}

então você deve ser capaz de fazer

git reset HEAD@{N}

Mas se você fez o git reset usando

git reset HEAD~3

você precisará fazer

git reset HEAD@{1}

Como {N} representa o número de operações no Reflog. Como Mark apontou nos comentários.


2
opção aceita não fornece exemplo de avanço A NI estava em uma situação há uma hora atrás, em que eu queria encaminhar mais de 1. Tentei várias e funcionou. Queria adicionar isso aqui. Será útil para pessoas que procuram redefinir desfazer com CABEÇA git reset ~ 3
zainengineer

3
mas se alguém tem git reset cabeça terminada ~ 3, ele pode ver rapidamente como desfazê-lo, HEAD git reset @ {3} é necessária, sem entrar em reflog CABEÇA git reset ~ 3 etc é uma situação comum
zainengineer

1
Eu acho que alguém que vê {1} / {2} perceberia que o número poderia ser qualquer número de revisão, reflogfornecido pelo comando. Concordou que seu argumento sobre os números serem os mesmos em qualquer direção ~ 3 / @ {3}, mas realmente não precisava ser uma nova resposta.
Clint

30

1. Use git reflogpara obter todas as referências atualizadas.

2)git reset <id_of_commit_to_which_you_want_restore>

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.