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:
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}
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.
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.
--hard
! O risco de executar acidentalmente esse comando é muito maior. Por exemplo, você deseja desfazer um único arquivo comgit 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 comandogit reset foo-branch
. VoilàRespostas:
Resposta curta:
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:
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:A primeira linha diz que
HEAD
0 posições atrás (em outras palavras, a posição atual) é 3f6db14; foi obtido redefinindo paraHEAD~
. A segunda linha diz queHEAD
1 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, executegit reset HEAD@{1}
(ougit 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
reflog
para o ramo específico que você deseja restaurar, digamos mestre, em vez deHEAD
:Isso deve ter menos ruído do que o geral
HEAD reflog
.fonte
reflog
para esse fim, eu gosto de usargit log --graph --decorate --oneline $(git rev-list -g --all)
. Ele mostra uma árvore de todas as submissões, incluindo balançando ramos sem nomegit init
e depois dissogit reset --hard
. Não há reflog, nem mesmo logs para começar. Esses arquivos estão praticamente prontos agora?git add
(ou seja, nunca preparou essa versão do arquivo), entãogit checkout
ougit reset --hard
expulsará a única cópia (o diretório de trabalho) sem backup. Eu gostaria que não.git reset HEAD~12
oops ...git reset HEAD@{12}
nãooo .. 'git reflog' para o resgate! Ah, é sógit reset HEAD@{1}
Pergunta antiga e as respostas postadas funcionam muito bem. Mas eu vou gritar com outra opção.
git reset ORIG_HEAD
ORIG_HEAD
referencia o commit queHEAD
referenciou anteriormente.fonte
git reset ORIG_HEAD
? Obrigado.Minha situação era um pouco diferente, eu fiz
git reset HEAD~
três vezes.Para desfazer eu tinha que fazer
então você deve ser capaz de fazer
Mas se você fez o git reset usando
você precisará fazer
Como {N} representa o número de operações no Reflog. Como Mark apontou nos comentários.
fonte
reflog
fornecido 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.1. Use
git reflog
para obter todas as referências atualizadas.2)
git reset <id_of_commit_to_which_you_want_restore>
fonte