É possível desfazer as alterações causadas pelo seguinte comando? Se sim, como?
git reset --hard HEAD~1
git
version-control
git-reset
Paul Wicks
fonte
fonte
--hard
descarta alterações não confirmadas. Como eles não são rastreados pelo git, não há como restaurá-los através do git.Respostas:
Pat Notz está correto. Você pode recuperar o commit desde que dentro de alguns dias. O lixo do git só é coletado após cerca de um mês, a menos que você diga explicitamente para remover os blobs mais recentes.
Você pode ver no exemplo que o arquivo2 foi removido como resultado da reinicialização completa, mas foi colocado novamente no local quando redefinei por meio do reflog.
fonte
git log -g
pode ser uma maneira um pouco melhor de ver o reflog do quegit reflog
.git reflog
maisgit log -g
simplesmente porque você obter todas as informações em uma linha com sha1, info HEAD e as mensagens de todos alinhados. Muito mais fácil de ler.O que você deseja fazer é especificar o sha1 da confirmação para a qual você deseja restaurar. Você pode obter o sha1 examinando o reflog (
git reflog
) e fazendogit reset --hard <sha1 of desired commit>
Mas não espere muito ... depois de algumas semanas, o git acabará vendo esse commit como não referenciado e excluirá todos os blobs.
fonte
A resposta está oculta na resposta detalhada acima, você pode simplesmente fazer:
(Veja a saída do git reflog show )
fonte
É possível recuperá-lo se o Git ainda não tiver coletado lixo.
Obtenha uma visão geral dos commits dangling com
fsck
:Recupere o commit dangling com rebase:
fonte
Se você tiver muita sorte, como eu, você pode voltar ao seu editor de texto e clicar em 'desfazer'.
Sei que essa não é realmente uma resposta adequada, mas me salvou meio dia de trabalho, então espero que faça o mesmo com outra pessoa!
fonte
até onde eu sei,
--hard
descartará alterações não confirmadas. Como esses não são rastreados pelo git. mas você pode desfazer odiscarded commit
.lista:
onde
4bac331
representa adiscarded commit
.Agora basta mover a cabeça para esse commit ::
fonte
Exemplo de caso de IRL:
$ git fsck --lost-found
$ git show f6ce1a403399772d4146d306d5763f3f5715cb5a
$ git rebase f6ce1a403399772d4146d306d5763f3f5715cb5a
fonte
Na maioria dos casos, sim.
Dependendo do estado em que seu repositório estava quando você executou o comando, os efeitos de
git reset --hard
podem variar de trivial a desfazer, a basicamente impossível.Abaixo, listei uma variedade de diferentes cenários possíveis e como você pode se recuperar deles.
Todas as minhas alterações foram confirmadas, mas agora as confirmações acabaram!
Essa situação geralmente ocorre quando você executa
git reset
um argumento, como emgit reset --hard HEAD~
. Não se preocupe, é fácil recuperar isso!Se você acabou de executar
git reset
e não fez mais nada desde então, pode voltar para onde estava com este recurso:Isso redefine sua ramificação atual em qualquer estado em que estava antes da última vez em que foi modificada (no seu caso, a modificação mais recente na ramificação seria a redefinição definitiva que você está tentando desfazer).
Se, no entanto, você tiver feito outras modificações em sua ramificação desde a redefinição, o one-liner acima não funcionará. Em vez disso, você deve executar para ver uma lista de todas as alterações recentes feitas em sua ramificação (incluindo redefinições). Essa lista será mais ou menos assim:
git reflog
<branchname>
Encontre a operação nesta lista que deseja "desfazer". No exemplo acima, seria a primeira linha, a que diz "redefinir: movendo para HEAD ~". Em seguida, copie a representação da confirmação antes (abaixo) dessa operação. No nosso caso, isso seria
master@{1}
(ou3ae5027
, ambos representam o mesmo commit) e executadogit reset --hard <commit>
para redefinir sua ramificação atual de volta para esse commit.Organizei minhas alterações com
git add
, mas nunca me comprometi. Agora minhas mudanças se foram!Isso é um pouco mais difícil de recuperar. git faz tem cópias dos arquivos que você adicionou, mas desde que essas cópias não estavam vinculados a qualquer particular, comprometer você não pode restaurar as alterações de uma só vez. Em vez disso, você precisa localizar os arquivos individuais no banco de dados do git e restaurá-los manualmente. Você pode fazer isso usando
git fsck
.Para obter detalhes sobre isso, consulte Desfazer git reset --hard com arquivos não confirmados na área de preparação .
Tive alterações nos arquivos do meu diretório de trabalho com os quais nunca estageei
git add
e nunca confirmei. Agora minhas mudanças se foram!Ah, oh. Eu odeio dizer isso, mas você provavelmente está sem sorte. O git não armazena alterações que você não adiciona ou confirma, e de acordo com a documentação para
git reset
:É possível que você pode ser capaz de recuperar as suas alterações com algum tipo de utilitário de recuperação de disco ou um serviço de recuperação de dados profissional, mas neste momento isso é provavelmente mais problemas do que vale a pena.
fonte
Se você ainda não coletou lixo no seu repositório (por exemplo, usando
git repack -d
orgit gc
, mas observe que a coleta de lixo também pode ocorrer automaticamente), seu commit ainda está lá - ele não está mais acessível através do HEAD.Você pode tentar encontrar seu commit olhando através da saída de
git fsck --lost-found
.As versões mais recentes do Git têm algo chamado "reflog", que é um log de todas as alterações feitas nas refs (em oposição às alterações feitas no conteúdo do repositório). Então, por exemplo, toda vez que você alternar seu HEAD (ou seja, toda vez que você
git checkout
alternar ramos), isso será registrado. E, é claro, vocêgit reset
também manipulou o HEAD, por isso também foi registrado. Você pode acessar estados mais antigos de suas referências de maneira semelhante a acessar estados mais antigos de seu repositório, usando um@
sinal em vez de um~
, comogit reset HEAD@{1}
.Demorei um pouco para entender qual a diferença entre HEAD @ {1} e HEAD ~ 1, então aqui está uma pequena explicação:
Então,
HEAD~1
significa "ir para o commit antes do commit que o HEAD aponta atualmente", enquantoHEAD@{1}
significa "ir para o commit que o HEAD apontou antes de apontar para onde aponta atualmente".Isso permitirá que você encontre com facilidade o seu commit perdido e o recupere.
fonte
Antes de responder, vamos adicionar alguns antecedentes, explicando o que é isso
HEAD
.First of all what is HEAD?
HEAD
é simplesmente uma referência ao commit atual (mais recente) no branch atual.Só pode haver um single
HEAD
a qualquer momento. (excluindogit worktree
)O conteúdo de
HEAD
é armazenado dentro.git/HEAD
e contém os 40 bytes SHA-1 da confirmação atual.detached HEAD
Se você não está no último commit, o que significa que
HEAD
está apontando para um commit anterior no históricodetached HEAD
.Na linha de comando, será semelhante a este - SHA-1 em vez do nome da ramificação, pois
HEAD
não está apontando para a ponta da ramificação atualAlgumas opções sobre como recuperar de um HEAD desanexado:
git checkout
Isso fará o checkout do novo ramo apontando para o commit desejado.
Este comando fará checkout para um determinado commit.
Nesse ponto, você pode criar uma ramificação e começar a trabalhar a partir deste ponto.
git reflog
Você sempre pode usar o
reflog
também.git reflog
exibirá qualquer alteração que tenha atualizadoHEAD
e o check-out da entrada de reflog desejadaHEAD
retornará a esta confirmação.Sempre que o HEAD for modificado, haverá uma nova entrada no
reflog
Isso o levará de volta ao seu commit desejado
git reset HEAD --hard <commit_id>
"Mova" sua cabeça para o commit desejado.
você também pode usá-lo
git rebase --no-autostash
.git revert <sha-1>
"Desfazer" o intervalo de confirmação ou confirmação fornecido.
O comando reset irá "desfazer" quaisquer alterações feitas no commit fornecido.
Um novo commit com o patch desfazer será confirmado enquanto o commit original também permanecerá no histórico.
Este esquema ilustra qual comando faz o quê.
Como você pode ver lá,
reset && checkout
modifique o arquivoHEAD
.fonte
git reset HEAD --hard <commit_id>
exemplo foi retirado de stackoverflow.com/questions/4114095/… - Se for esse o caso, você poderia editar na atribuição?git reflog
git cherry-pick <the sha>
fonte
Sei que esse é um tópico antigo ... mas, como muitas pessoas estão procurando maneiras de desfazer coisas no Git, ainda acho que pode ser uma boa ideia continuar dando dicas aqui.
Quando você faz um "git add" ou move qualquer coisa do canto superior esquerdo para o canto inferior esquerdo no guit do git, o conteúdo do arquivo é armazenado em um blob e é possível recuperar o conteúdo do arquivo.
Portanto, é possível recuperar um arquivo, mesmo que não tenha sido confirmado, mas tenha que ter sido adicionado.
Agora, o blob é criado, mas é referenciado pelo índice, portanto não será listado com o git fsck até que seja redefinida. Então, redefinimos ...
você receberá um blob pendente ce013625030ba8dba906f756967f9e9ca394464a
retornará o conteúdo do arquivo "olá" de volta
Para encontrar commits não referenciados, encontrei uma dica em algum lugar sugerindo isso.
Eu o tenho como uma ferramenta no git gui e é muito útil.
fonte
git fsck --lost-found
pode ajudar.Se você estiver usando um JetBrains IDE (qualquer coisa baseada no IntelliJ), poderá recuperar até as alterações não confirmadas através do recurso "Histórico local".
Clique com o botão direito do mouse no diretório de nível superior da árvore de arquivos, encontre "Local History" no menu de contexto e escolha "Show History". Isso abrirá uma visualização onde suas edições recentes podem ser encontradas e, depois de encontrar a revisão para a qual você deseja voltar, clique com o botão direito do mouse e clique em "Reverter".
fonte
Acabei de fazer uma redefinição definitiva no projeto errado. O que salvou minha vida foi a história local do Eclipse. Diz-se que o IntelliJ Idea também possui um, e também o seu editor, vale a pena conferir:
fonte
Criou um script minúsculo para facilitar a localização do commit que você está procurando:
git fsck --lost-found | grep commit | cut -d ' ' -f 3 | xargs -i git show \{\} | egrep '^commit |Date:'
Sim, pode ser consideravelmente mais bonito com awk ou algo parecido, mas é simples e eu só precisava. Pode salvar alguém mais 30 segundos.
fonte
Meu problema é quase semelhante. Tenho arquivos não confirmados antes de entrar
git reset --hard
.Agradecidamente. Consegui pular todos esses recursos. Depois notei que posso apenas desfazer (
ctrl-z
). 😊 Eu só quero adicionar isso a todas as respostas acima.Nota. Não é possível
ctrl-z
arquivos não abertos.fonte
Isso salvou minha vida:
https://medium.com/@CarrieGuss/how-to-recover-from-a-git-hard-reset-b830b5e3f60c
Basicamente, você precisa executar:
Em seguida, passe manualmente pelo esforço de reorganizar seus arquivos na estrutura correta.
Resumo: nunca use
git reset --hard
se você não entender completamente como funciona, é melhor não usá-lo.fonte