O git pode desfazer um check-out de arquivos não estágios

164

Eu descarto acidentalmente minhas alterações em arquivos na minha árvore de trabalho local via git checkout. Os arquivos não são testados no momento. É possível "desfazer" este checkout?

Herr W.
fonte
Não, não podemos, mas se você estiver usando o eclipse, podemos verificar Equipe -> Histórico local
USM

Respostas:

105

Acredito que se um arquivo for modificado, mas ainda não foi adicionado (em etapas), é puramente "privado".
Significando que não pode ser restaurado pelo GIT se substituído pelo índice ou pela versão HEAD (a menos que você tenha uma cópia do seu trabalho atual em algum lugar). "

Um conteúdo "privado" é apenas visível no seu diretório atual, mas não é registrado de forma alguma no Git.

VonC
fonte
5
Entendo que as alterações em um arquivo 'privado' não podem ser desfeitas pelo git. No entanto, se o arquivo foi modificado pelo git (por exemplo, via git checkout --), espero que seja capaz de desfazer essa operação, talvez através do reflog. Essa é uma expectativa errada?
Ciprian Tomoiagă
2
O reflog @CiprianTomoiaga é para confirmações não referenciadas no passado . Se o que você deseja restaurar não foi confirmado (ou preparado), o reflog não o ajudará.
VonC 27/11/16
3
@CiprianTomoiaga para qualquer tipo de conteúdo privado (ainda não adicionado), você confiaria apenas no seu editor ou recurso IDE. Exemplo para eclipse: help.eclipse.org/neon/…
VonC 27/11
5
Uau! Inacreditável. Eu precisava dar uma olhada em um arquivo, então eu quis digitar, git checkout folders/subfolders/filemas apertei enter por acidente depois de chegar foldere perdi todo o meu trabalho. / fica a 1 cm do teclado e alterno entre máquinas com diferentes layouts de teclado, de modo que geralmente há 10 a 15 minutos dos meus dedos se acostumando a novas posições. Difícil de acreditar em 2018 que o git lixeira de arquivos, mesmo dizendo no livro do git que o git faz o possível para não perder o trabalho.
gman
1
@gman, a resposta abaixo sobre "histórico local" fornecida por um IDE ajuda a recuperar seu trabalho?
VonC 04/07
173

Se você estiver usando um IDE "profissional", há boas chances de restaurar arquivos de um Histórico local. No Rubymine, por exemplo, você pode clicar com o botão direito do mouse nos arquivos e assistir a um histórico de alterações independentes das alterações do git, me salvou algumas vezes agora ^^

Christoph Geschwind
fonte
36
Para sua informação, este recurso está disponível em toda a família JetBrains de IDE "profissionais": Pycharm, IDEA, PHPStorm, Webstorm. Salvei meu bakken hoje. Obrigado, Christoph!
Ben Roberts
6
Eu tenho que te agradecer Eu uso o WebStorm e esqueci completamente esse recurso, mesmo que o use com bastante frequência. Eu estava tão envolvido com a perda de código que nem pensei nisso!
Tyson Phalp
8
No eclipse você pode clique direito sobre o arquivo -> comparar com -> história local
Maragues
5
excelente. O Sublime2 desfazer também reverteu as alterações feitas pelo check-out acidental do git no disco.
shuckc
8
Se alguém descobrir que esse thread destruiu algum trabalho no XCode, existe uma maneira de obter o histórico do AutoSave. O próprio XCode não possui uma entrada de menu para ver o histórico do AutoSave, mas o armazena. Se você abrir os arquivos em questão no TextEdit, poderá reverter e examinar o histórico do AutoSalvar em Arquivo> Reverter.
Qing
66

Se você estiver trabalhando em um editor como o Sublime Text e ainda tiver um arquivo em aberto, pressione ctrl + z e ele retornará ao estado que tinha antes do git checkout.

romano-romano
fonte
9
Esta resposta está salva no meu dia. Muito obrigado!
Feyyaz 13/11
Tropecei nessa correção por acidente agora e estava prestes a postar uma nova resposta. Parece que o Sublime captura o Git alterando o estado do arquivo no seu histórico de modificações.
precisa saber é
Trabalhou para mim no Ecipse.
Anomaly
4
Trabalhou também para o Visual Studio Code
intotecho 9/09/18
44

Infelizmente, suas alterações foram perdidas. Suas modificações particulares são simplesmente substituídas. A menos que você tenha git stashfeito o check-out antes ...

Veja do lado positivo: agora você pode implementar as coisas ainda melhor;)

Marcin Gil
fonte
26

Verifique o histórico local no seu IDE.

Marcin Szymczak
fonte
Cometi um erro de não organizar minhas alterações e forçou um checkout. Verifiquei meu histórico local no Android Studio (visualização -> alterações recentes) e reverti as últimas alterações que fiz. Mais informações aqui jetbrains.com/help/idea/2016.3/…
emen
Isso funciona perfeitamente bem no RubyMine, a ação de eliminar suas alterações será referenciada como "Alteração externa". Muito obrigado por este Marcin, apenas me salvou uma hora de trabalho perdido!
AndrewSouthpaw
25

Desenvolvendo no OS X? Usando o Xcode? Você provavelmente está com sorte!

Conforme descrito em um comentário do qungu , o OS X mantém um histórico de versão salvo automaticamente, mesmo que você não esteja usando a máquina do tempo .

Então, se você desintegradas suas alterações locais unstaged com um descuidado git checkout ., aqui está como você pode , provavelmente, recuperar todo o seu trabalho.

Se alguém descobrir que esse thread destruiu algum trabalho no XCode, existe uma maneira de obter o histórico do AutoSave. O próprio XCode não possui uma entrada de menu para ver o histórico do AutoSave, mas o armazena. Se você abrir os arquivos em questão no TextEdit, poderá reverter e examinar o histórico do AutoSalvar em Arquivo> Reverter.

O que é incrível, e recuperei um dia de trabalho para mim ontem.


Você pode perguntar: "Por que a interface de usuário da linha de comando git, o principal VCS usado para engenharia de software em2016 2017 20182019, pelo menos, faça backup de arquivos antes de simplesmente descartá-los? Você sabe, ferramentas de software bem escritas nas últimas três décadas ".

Ou talvez você pergunte: "Por que esse recurso incrivelmente impressionante de histórico de arquivos está acessível no TextEdit, mas não no Xcode, onde eu realmente preciso?"

… E acho que os dois falarão bastante sobre a nossa indústria. Ou talvez você vá consertar essas ferramentas. O que seria super.

Benjohn
fonte
2
Eu posso confirmar que isso funciona. Isso me salvou horas de trabalho!
Bruno Rocha
não funcionou para mim porque o arquivo em questão era o Modelinfelizmente
brahimm
@brahimm the Model?
precisa saber é
1
Isso me salvou uma tonelada de mágoa. Muito obrigado.
Squarefrog 19/04/19
1
Muito interessante: cliquei com o botão direito do mouse no meu arquivo de origem e observei o menu "Abrir com". O TextEdit 1.14 e o TextEdit 1.6 estavam lá como opções. Somente o TextEdit 1.14 teve a opção de reverter para revisões mais antigas. A interface do usuário era muito boa, assim como o TimeMachine.
bugloaf
6

No VSCODE, ctrl + z (desfazer) funcionou para mim

Eu fiz em git checkout .vez de git add .e todas as minhas alterações de arquivo foram perdidas.

Mas agora usando command + zno meu mac, recuperei as alterações e salvou um tom de trabalho para mim.

ishab acharya
fonte
existe alguma outra maneira de contornar?
Abdul Manan
3

Caso você tenha ocultado as alterações mais cedo (por exemplo, antes do rebaseamento), isso provavelmente ajudará

Como recuperar um esconderijo descartado no Git?

mesmo se você já tiver 'stash' fez as alterações.

iksa
fonte
2

Um salvador eficaz para esse tipo de situação é o Time Machine (OS X) ou um sistema de backup baseado em tempo semelhante. Isso me salvou algumas vezes, porque eu posso voltar e restaurar apenas esse arquivo.

sscirrus
fonte
1
Caro downvoter - você poderia explicar como posso melhorar esta resposta?
Sscirrus
1

Acabei de acontecer, verifiquei uma pasta inteira contendo horas de trabalho! Felizmente, descobri que meu IDE Netbeans mantém um histórico de cada arquivo, o que me permitiu recuperar 99% das coisas, mesmo que eu precisasse corrigir algumas coisas manualmente.

Pierre-Verthume Larivière
fonte
0

Tecnicamente sim. Mas apenas em certos casos. Se, por exemplo, você tem a página de código aberta e pressiona o git checkout, percebe que fez check-out acidental da página errada ou algo assim. Vá para a página e clique em desfazer. (para mim, comando + z), e ele voltará exatamente para onde você estava antes de chegar ao bom e velho check-out do git.

Isso não funcionará se sua página foi fechada e você clicar em git checkout. Só funciona se a página de código real estiver aberta

kdweber89
fonte
0

Se você trabalha com um terminal / cmd prompt de aberta, e utilizado qualquer comando git que teria mostrado as mudanças unstaged ( diff, add -p, checkout -p, etc.), e não ter fechado o terminal / cmd prompt de uma vez, você vai encontrar as mudanças unstaged ainda estarão disponíveis se você rolar até onde você executou os comandos git mencionados acima.

sapato
fonte
0

Cara,

digamos que você seja um cara de muita sorte, como eu fui, volte para o seu editor e faça um desfazer (comando + Z para mac), você deverá ver o conteúdo perdido no arquivo. Espero que tenha ajudado. Obviamente, isso funcionará apenas para arquivos existentes.

codemania23
fonte
-1

Talvez suas alterações não estejam perdidas. Marque "git reflog"

Cito o artigo abaixo:

"Basicamente, todas as ações que você executa dentro do Git onde os dados são armazenados, você pode encontrá-los dentro do reflog. O Git se esforça para não perder seus dados. Portanto , se por algum motivo você acha que tem, é provável que você possa desenterrá-lo usando git reflog "

Veja detalhes:

http://gitready.com/intermediate/2009/02/09/reflog-your-safety-net.html

robertobado
fonte
3
Não tenha muitas esperanças - o reflog só ajuda se você estiver interagindo com o git de maneira significativa. Apenas editando um arquivo e removendo-o através de um checkout do git? Git nunca teve uma chance.
22813 Bob Gilmore
1
+1 de mim - acho que vale a pena mencionar git reflogaqui, encontrei esta resposta quando estava procurando desfazer um git checkout HEAD .- eu pretendia digitar git reset HEAD .- eu tinha acabado de fazer um 'git reset --soft HEAD ~ 1' e não sabia sobre o git reflogmodo foi capaz de receber de volta o trabalho que tinha feito :)
Russell England
1
Infelizmente, o git checkout <revision> e o git checkout <path> são dois comandos completamente diferentes e não relacionados. O primeiro mantém suas alterações locais, o último não.
Lake