Restauração GIT último HEAD desanexado

87

Por favor, estou com um grande problema no meu projeto: esse é o cenário. Eu tenho um projeto xcode no GIT. Hoje percebi que o último commit quebrou alguns testes, então dei uma olhada no commit anterior. Eu usei SourceTree e este é o aviso

Fazer isso tornará sua cópia de trabalho um 'HEAD destacado', o que significa que você não estará mais em um branch. Se você quiser fazer um commit depois disso, você provavelmente vai querer fazer o checkout de um branch novamente ou criar um novo. Está tudo bem?

Trabalhei um dia inteiro e no final comprometi tudo. Então, eu precisava mesclar meu trabalho no branch de desenvolvimento, então verifiquei o branch de desenvolvimento e ... meu trabalho desapareceu instantaneamente :(

Eu sei que foi errado desligar minha CABEÇA e Sourcetree me avisou ... mas existe uma maneira de restaurar meu trabalho?

IgnazioC
fonte
Um tópico relacionado para o mesmo problema aqui e os detalhes técnicos sobre como isso acontece aqui .
RBT

Respostas:

259

Se você digitar git reflog, ele mostrará o histórico das revisões HEADapontadas. Sua cabeça destacada deve estar lá. Depois de encontrá-lo, faça git checkout -b my-new-branch abc123ou git branch my-new-branch abc123(onde abc123está o SHA-1 da CABEÇA destacada) para criar um novo ramo que aponta para sua cabeça destacada. Agora você pode mesclar essa filial quando quiser.

Geralmente, se você fizer check-out de um branch após trabalhar em um head desanexado, o Git deve informar o commit do head desanexado em que você estava, para que você possa recuperá-lo se precisar. Eu nunca usei SourceTree, então não sei se ele retransmite essa mensagem. Mas se ele exibiu essa mensagem, então você deve ser capaz de usar isso para encontrar o commit e, novamente, usar git checkout -bou git branchcriar um branch desse commit.

Brian Campbell
fonte
5
Obrigado Brian. Você salvou meu dia.
Muzammil
Brian, você salvou minha vida! Obrigado!!
cldrr
Eu sou novo no git .. estou começando fatal: A branch named 'mybranch' already exists.Como adicionar um branch existente?
Ramesh Murugesan,
1
Como um PSA para todos aqueles que agradecem a Brian: Se você estiver fazendo um trabalho que não quer perder, envie-o para um controle remoto (por exemplo, github) a cada poucas horas. Quando um meteoro cair em seu computador, você ficará feliz por isso. Se você ainda não está pronto para compartilhá-lo com os colaboradores, basta colocá-lo em um branch que ninguém conhece por enquanto e, em seguida, rebaseá-lo no master mais tarde.
MatrixManAtYrService
1
Além disso, se for um único commit perdido que simplesmente desapareceu e você o encontrou lá, você pode trazê-lo de volta com git cherry-pick e5b2f7b, onde e5b2f7bestá o SHA-1 do commit aí.
Aidin,
10

No Sourcetree, você pode fazer isso usando a GUI.

Primeiro encontre o commit "perdido" procurando por uma mensagem no Histórico de Comandos (visão: Mostrar Saída de Comando). Provavelmente estará no comando "Switching Branch" após o commit que você perdeu. Nessa mensagem, espero que você veja o comentário de confirmação com um ID de confirmação 1234567.

Leve esse ID de confirmação para a próxima etapa.

Clique no botão "Branch" na barra de ferramentas superior e você deverá obter uma caixa de diálogo "New Branch" onde você pode especificar um determinado commit. Coloque aquele Commit ID lá, especifique um novo nome de branch, clique em Create Branch e você deve obter um novo branch com seu commit perdido!

insira a descrição da imagem aqui

blalond
fonte
realmente funciona. Certifique-se de ver o comentário correto com o ID do commit.
Hammad Khan
@blalond Olá, Depois de ler sua resposta, tenho uma pequena pergunta: Quando em SourceTree eu clico duas vezes em um commit anterior (a fim de verificar), recebo a mesma mensagem de que isso causaria um descolamento de cabeça, então eu me pergunto o que significa quando as pessoas dizem que você pode simplesmente voltar para qualquer revisão anterior com o git? Como faço para reverter para um determinado commit então? Obrigado
5

Se você não deseja manter as alterações do HEAD desanexado e deseja ir para o último branch commit, use o comando abaixo diretamente.

git checkout - 

Observação: irei deletar todas as suas alterações no HEAD desanexado.

Rosa do Deserto
fonte
O OP pediu para manter o trabalho. Isso não responde à pergunta original. Apenas adicionar a opção de mantê-lo em um ramo tornaria essa resposta útil.
manuelvigarcia
1

Um colega meu acabou de passar por esta situação. No caso dele, havia commits no head destacado - eles funcionam no R-Studio-- e a ferramenta os avisou que eles poderiam criar o branch com esta e aquela referência SHA ... mas uma vez que a única opção era "Fechar" --duh !! era uma caixa de informações - eles fecharam o diálogo e perderam as informações para sempre ...

Graças ao reflogcomando pudemos ver que as mudanças não foram perdidas. Mas, em nosso caso, o git branchnão funcionou como esperado ... ou uma entrada git pullbagunçou de alguma forma. Tivemos que pescar as mudanças do reflog para o branch recém-criado:

 git cherry-pick 0b823d42..3cce27fc

que colocou todos os commits que queríamos no branch. Então, poderíamos mesclar o branch developsem problemas.

Apenas no caso de ser informativo para alguém, identificamos os commits no head destacado no reflogolhando aqueles entre os marcados com "checkout" (que identificam deslocamento de ramificação):

e09f183b HEAD@{3}: pull: Fast-forward
b5bf3e1d HEAD@{4}: checkout: moving from lost_changes to develop
b5bf3e1d HEAD@{5}: checkout: moving from 3cce27fca50177a288df0252f02edd5da5ee64fd to lost_changes
3cce27fc HEAD@{6}: commit: add statistics
417a99a4 HEAD@{7}: commit: add test
0b823d42 HEAD@{8}: commit: new utility class
d9ea8a63 HEAD@{9}: checkout: moving from develop to d9ea8a635d4c2349fcb05b3339a6d7fad5ae2a09
b5bf3e1d HEAD@{10}: pull: Fast-forward

Aqueles que queria foram HEAD@{8}para HEAD@{6}(ambos inclusive). Então, nós os obtemos por:

git cherry-pick 0b823d42..3cce27fc

Então, a solução usual de mesclagem e o commit final nos deixaram com o branch lost_changes hospedando o trabalho destacado que pensávamos perdido. A fusão com o desenvolvimento foi um avanço rápido desta vez.

manuelvigarcia
fonte
0

Eu tentei este cenário, e descobri que git me diga SHA-1 do último commit:

vors@localhost:~/git-test$ git checkout master 
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  ec600e6 333

If you want to keep them by creating a new branch, this may be a good time
to do so with:

 git branch new_branch_name ec600e6eb2473dd4f3732539c5c1fa5829f631b7

Switched to branch 'master'

Você viu esta mensagem?

xvorsx
fonte
não. ou talvez eu não preste atenção. Estou procurando um backup no timemachine; (
IgnazioC
1
@IgnazioC Você não precisa consultar um backup. Você deu uma olhada na minha resposta? git reflogdeve mostrar o que você precisa.
Brian Campbell
0

cabeça destacada está bem, contanto que você queira fazer nenhuma alteração

Se você quiser reverter um commit, você pode usar git revert em um branch específico

Se você quiser trabalhar fora da cabeça destacada e fazer commits; crie um novo branch (e depois mescle-o);

Forvaidya
fonte
sim! nós conhecemos as regras. Mas quando os colegas trabalham fora da cabeça destacada e depois abandonam esses commits, eles pedem respostas, não regras.
manuelvigarcia
0
  1. Primeiro, corra git reflogpara ver o histórico.
  2. A revisão mais antiga será a última da lista.
  3. Mude para o commit desejado usando git checkout -b temp e35d2b3aqui e35dd23 é o valor hash do seu commit.
  4. É isso aí. Agora basta fazer git add. etc ....

Aceite-o como uma resposta se resolver o seu problema. Caso contrário, compartilhe seu comentário.

Sohaib
fonte