Git desfazer exclusão de ramificação local


377

Acabei de excluir o ramo errado com algumas alterações experimentais que preciso git branch -D branchName.

Como recupero a ramificação?


7
Fico feliz em saber que eu não sou o único lame-o quem fez isso (e se esqueceu de empurrar regularmente para remoto uma cópia)
Ray

Respostas:


719

Você pode usar o git reflog para encontrar o SHA1 do último commit da ramificação. A partir desse ponto, você pode recriar uma ramificação usando

git branch branchName <sha1>

Edit: Como o @seagullJS diz, o branch -Dcomando informa o sha1, por isso, se você ainda não fechou o terminal, ele se torna muito fácil. Por exemplo, isso exclui e restaura imediatamente uma ramificação chamada master2:

user@MY-PC /C/MyRepo (master)
$ git branch -D master2
Deleted branch master2 (was 130d7ba).    <-- This is the SHA1 we need to restore it!

user@MY-PC /C/MyRepo (master)
$ git branch master2 130d7ba

71
O Git diz a você qual era o SHA1 quando o ramo foi excluído, portanto, se você o excluir, poderá haver apenas algumas linhas na linha de comando.
seagullJS

se este ramo existe no servidor, como alternativa, você pode usargit branch branchName origin/branchName
Florian Castellane

Além disso, eu acabei usando git cherry-pick <sha1> para mover a comprometer-se a branch
Akin Okegbile

54

Se você conhece o último SHA1 da ramificação, pode tentar

git branch branchName <SHA1>

Você pode encontrar o SHA1 usando git reflog, descrito na solução aqui .


34

Se você ainda não enviou a exclusão, pode simplesmente:

$ git checkout deletedBranchName

Essa resposta faz o Git Extensions calar a boca sobre "o ramo que você está tentando enviar parece ser um novo ramo para este controle remoto". Muito obrigado.
Omer

29

Se você acabou de excluir a ramificação, verá algo parecido com isto em seu terminal:

Deleted branch branch_name(was e562d13)
  • onde e562d13 é um ID exclusivo (também conhecido como "SHA" ou "hash"), com isso você pode restaurar a ramificação excluída.

Para restaurar a ramificação, use:

git checkout -b <branch_name> <sha>

por exemplo :

git checkout -b branch_name e562d13 

4

Primeiro: faça backup de todo o diretório, incluindo o diretório .git.

Segundo: você pode usar git fsck --lost-foundpara obter o ID das confirmações perdidas.

Terceiro: rebase ou mesclagem no commit perdido.

Quarto: sempre pense duas vezes antes de usar -D ou --force com git :)

Você também pode ler esta boa discussão sobre como se recuperar desse tipo de erro.

EDIT: A propósito, não corra git gc(ou permita que ele corra sozinho - ou seja, não corra git fetchou algo parecido) ou você poderá perder seus commits para sempre.


11
1 e 4 são IMO em excesso.
GTC

Sim, é por isso que usamos o git, para evitar ter que carregar tudo isso por aí. Todas as ações que você cometeu ainda estão disponíveis para você.
mateor

4

Obrigado, isso funcionou.

ramificação git new_branch_name sha1

git checkout new_branch_name

// pode ver meus arquivos antigos registrados no meu ramo antigo


3

Siga esses passos:

1: Digite:

git reflog show 

Isso exibirá todo o histórico de confirmação, você precisa selecionar o sha-1 que tem o último commit que você deseja recuperar

2: crie um nome de filial com o ID Sha-1 selecionado, por exemplo: 8c87714

git branch your-branch-name 8c87714

0

Isso funcionou para mim:

git fsck --full --no-reflogs --unreachable --lost-found
git show d6e883ff45be514397dcb641c5a914f40b938c86
git branch helpme 15e521b0f716269718bb4e4edc81442a6c11c139
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.