Acidentalmente revertido para master, perdeu as alterações não confirmadas

Eu consegui fazer um erro enorme (em uma manhã de segunda-feira) trabalhando no mestre, esqueça de criar novo ramo, fez alterações nos arquivos, em seguida, inadvertidamente, reverteram para o mestre, perdendo todas as atualizações. Não enviei os arquivos atualizados.

Perdi todas as atualizações ou posso recuperá-las?

Não me pergunte como, toda vez que penso nisso, tenho que me dar um soco no rosto.

Se você não tiver confirmado , encenado ou armazenado as alterações feitas, não será possível recuperar essas alterações.

EDIT: Recuperando as alterações perdidas. Adicionando isto na sugestão de Mark Longair (no comentário). Isso também inclui um par de links SO de sua resposta abaixo (*), que eu achei bastante informativo.

  • Se você alguma vez cometeu alguma alteração e perdeu esse commit (como commiting em um estado desanexado), você pode descobrir que commit usa o reflog . Veja esta questão SO *.

  • Se você perdeu seu último estágio alterado, você também pode recuperar isso. Veja esta questão SO *. (Eu nunca usei ou tentei eu mesmo).

  • Se você ocultou uma alteração, também poderá recuperá-la usando pop ou apply . (Não tenho certeza se os stashes popped / dropped também são recuperáveis ​​e não foram confirmados). Você pode achar este Recover dropped stash in git useful.

Se houver qualquer outro método que alguém possa sugerir, eu edito essa resposta ainda mais para adicioná-los.

Dois longshots: Alguns IDEs, como o Delphi, mantêm um histórico de editor. Você pode ter algum recurso lá.
Em seguida, se você tiver o diretório de trabalho local localizado na pasta MyDocuments, pode ter sido feito o backup automático pelo Windows Home Server, pelo Carbonite, pelo MozyPro etc., que geralmente “configuram e esquecem”. talvez você tenha esquecido?

Eu estava preso na mesma situação.

Teve uma lista dos arquivos alterados no terminal antes do –hard reset, entrou no meu editor (Sublime 2, não importa embora), abri cada arquivo e pressione cmd + z (desfazer) uma vez, isso efetivamente desfez as alterações feito pelo hard reset e eu tenho minhas alterações não confirmadas de volta 🙂

A questão crítica aqui é o que você fez depois de fazer alterações nos arquivos. Se você criou um commit que continha o novo estado dos arquivos, então você poderá recuperá-los examinando as inputs recentes no git reflog , encontrando o SHA1sum do commit e então criando um novo branch a partir dele com git branch recovered ou similar. Há um exemplo de fazer isso nesta resposta .

Se você fez o git add em qualquer um dos arquivos para encená-los, você também deve ser capaz de recuperá-los, mas isso é um pouco mais trabalho – Jakub descreve como fazer isso nesta resposta .

Se você fez um git stash para se dar um status limpo, então é claro que você pode recuperá-lo como faria com qualquer outro stash.

Caso contrário, receio que a notícia não seja boa.

Eu espero que não seja enfurecedor apontar isso post-hoc, mas apenas voltar para a ramificação master , você não deveria ter precisado usar qualquer comando que possa perder seus dados – git checkout master teria lhe dito que você já estava no ramo principal e mostre todas as alterações não confirmadas. (Indiscutivelmente git reset --hard deve ter uma confirmação “Sim, eu realmente quero dizer isso” se houver mudanças não confirmadas, dada a frequência com que as pessoas ^W perdem dados dessa maneira.)

Use o reflog. git reflog mostrará uma história de todos os commits em que você esteve, em ordem cronológica.

Se você perdeu suas alterações “checando o mestre”, provavelmente estava trabalhando sem cabeça. git status lhe dirá se você está trabalhando sem cabeça. (Como faz o git branch ).

Trabalhar sem cabeça não é tão ruim assim (eu faço isso o tempo todo, deliberadamente), mas você terá uma maior confiança no reflog.

Se você não tiver confirmado suas alterações, de qualquer forma, não será possível recuperar esses arquivos. A única maneira realista que isso poderia ter acontecido é se você fez um hard reset, ou forçou explicitamente um checkout. Não force as alterações, a menos que tenha certeza de estar familiarizado com a perda de dados.

Normalmente, no git, ‘forçar’ é feito especificando -f .

Eu fiz a mesma coisa, mais de uma vez, infelizmente. Sem cometer nada, git não tem ideia do que você escreveu. Mesmo se você cometeu, então, quando para trás eu não tenho certeza reflexo ajudaria.