Git: Recuperar ramo (remoto) eliminado

Eu preciso recuperar dois ramos do Git que de alguma forma eu deletei durante um push.

Estas duas ramificações foram criadas em um sistema diferente e depois enviadas para o repository “compartilhado” (github).

No meu sistema, eu (aparentemente) recuperei os ramos durante uma busca:

~/myfolder> git fetch remote: Counting objects: 105, done. remote: Compressing objects: 100% (58/58), done. remote: Total 62 (delta 29), reused 0 (delta 0) Unpacking objects: 100% (62/62), done. From github.com:mygiturl * [new branch] contact_page -> origin/contact_page 731d1bb..e8b68cc homepage -> origin/homepage * [new branch] new_pictures -> origin/new_pictures 

Logo depois disso eu fiz um empurrão para enviar minhas alterações locais para o repository central. Por algum motivo, essas ramificações foram excluídas do meu sistema local e do repository central:

 ~/myfolder> git push Counting objects: 71, done. Delta compression using up to 2 threads. Compressing objects: 100% (43/43), done. Writing objects: 100% (49/49), 4.99 KiB, done. Total 49 (delta 33), reused 0 (delta 0) To git@github.com:mygiturl.git - [deleted] contact_page + e8b68cc...731d1bb homepage -> homepage (forced update) bb7e9f2..e0d061c master -> master - [deleted] new_pictures e38ac2e..bb7e9f2 origin/HEAD -> origin/HEAD 731d1bb..e8b68cc origin/homepage -> origin/homepage e38ac2e..bb7e9f2 origin/master -> origin/master * [new branch] origin/contact_page -> origin/contact_page * [new branch] origin/new_pictures -> origin/new_pictures 

Não é muito fácil tirar os twigs de sua máquina de nascimento, então eu gostaria de tentar recuperá-los do meu local, se possível.

Todas as informações do git “undo” que eu pesquisei foram recuperadas com commits perdidos. Eu não acho que se aplica aqui, desde que eu não tenha comido UIDs para esses ramos.

Eu gostaria de saber como posso recuperá-los. Eu também gostaria de saber como eles foram excluídos em primeiro lugar e como posso evitar isso no futuro.

EDIT: por solicitação, aqui está a minha configuração repo

 user.name=Craig Walker user.email=github@softcraft.ca alias.unadd=reset HEAD core.repositoryformatversion=0 core.filemode=true core.bare=false core.logallrefupdates=true core.ignorecase=true remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* remote.origin.url=git@github.com:MyGitURL.git remote.origin.mirror=true branch.master.remote=origin branch.master.merge=refs/heads/master alias.undo=reset --hard alias.test=push -f ci HEAD:master alias.st=status alias.ci=commit alias.br=branch alias.co=checkout alias.ch=checkout alias.df=diff alias.lg=log -p alias.who=shortlog -s -- remote.ci.url=ContinuousIntegrationGitURL remote.ci.fetch=+refs/heads/*:refs/remotes/ci/* branch.photo.remote=origin branch.photo.merge=refs/heads/photos remote.foo.url=FooGitURL remote.foo.fetch=+refs/heads/*:refs/remotes/cynthia/* branch.homepage.remote=origin branch.homepage.merge=refs/heads/homepage 

Eu não sou especialista. Mas você pode tentar

 git fsck --full --no-reflogs | grep commit 

para localizar o commit HEAD do branch deletado e recuperá-los.

Suas ramificações excluídas não são perdidas, elas foram copiadas para origin / contact_page e origin / new_pictures “remote tracking branches” pela busca que você mostrou (elas também foram empurradas para fora pelo push que você mostrou, mas elas foram enviadas para refs / remotes / origem / em vez de refs / heads /). Verifique git log origin/contact_page e git log origin/new_pictures para ver se suas cópias locais estão “atualizadas” com o que você acha que deveria estar lá. Se algum novo commit for enviado para os branches (de algum outro repository) entre o fetch e o push que você mostrou, você pode ter “perdido” esses (mas provavelmente você poderia encontrá-los no outro repo que mais recentemente empurrou esses branches) .

Buscar / empurrar conflito

Parece que você está buscando em um modo remoto normal (refs / heads / remote / são armazenados localmente em refs / remotes / origin /), mas pressionando em ‘mirror mode’ (refs locais / são enviados para refs remotos) . Verifique seu .git / config e reconcilie as configurações remote.origin.push e remote.origin.push .

Faça um backup

Antes de tentar qualquer alteração, faça um simples arquivo tar ou zip ou todo o seu repository local. Dessa forma, se você não gostar do que acontece, tente novamente em um repository restaurado.

Opção A: Reconfigurar como um espelho

Se você pretende usar seu repository remoto como um espelho do seu local, faça o seguinte:

 git branch contact_page origin/contact_page && git branch new_pictures origin/new_pictures && git config remote.origin.fetch '+refs/*:refs/*' && git config --unset remote.origin.push && git config remote.origin.mirror true 

Você também pode querer excluir todos os seus refs / remotes / origin / refs, já que eles não são úteis se você estiver operando no modo espelho (suas ramificações normais tomam o lugar das ramificações usuais de rastreamento remoto).

Opção B: Reconfigurar como um controle remoto normal

Mas, como parece que você está usando este repository remoto com vários repositorys “work”, provavelmente não deseja usar o modo espelho. Você pode tentar isto:

 git config push.default tracking && git config --unset remote.origin.push git config --unset remote.origin.mirror 

Então, você acabará por querer excluir os refs falsos refs / remotes / origin refs em seu repository remoto: git push origin :refs/remotes/origin/contact_page :refs/remotes/origin/new_pictures … .

Teste de Push

Tente o git push --dry-run para ver o que o git push faria sem fazer mudanças no repository remoto. Se você não gosta do que ele diz que vai fazer, recupere seu backup (tar / zip) e tente a outra opção.

apenas dois comandos salvam a minha vida

1. Isso listará todos os HEADs anteriores

 git reflog 

2. Isso irá reverter o HEAD para confirmar que você apagou.

 git reset --hard  ex. git reset --hard b4b2c02 

Os dados ainda existem no github, você pode criar um novo ramo a partir dos dados antigos:

 git checkout origin/BranchName #get a readonly pointer to the old branch git checkout –b BranchName #create a new branch from the old git push origin BranchName #publish the new branch 

Eu acho que você tem uma configuração incompatível para “buscar” e “empurrar”, então isso fez com que a busca / envio padrão não fosse de volta corretamente. Felizmente, você buscou as ramificações que foram excluídas posteriormente, para poder recriá-las com um push explícito.

 git push origin origin/contact_page:contact_page origin/new_pictures:new_pictures 

Se a exclusão for recente o suficiente (como um momento Oh-NÃO!), Você ainda deve ter uma mensagem:

Deleted branch (was abcdefghi).

você ainda pode executar:

git checkout abcdefghi

git checkout -b

Se a sua organização usa o JIRA ou outro sistema semelhante que esteja vinculado ao git, você pode encontrar as confirmações listadas no próprio ticket e clicar nos links para as alterações no código. O Github exclui a ramificação, mas ainda tem os commits disponíveis para seleção de cereja.

  1. descobrir código coimmit

    git reflog

  2. recuperar ramificação local que você excluiu por engano

    git ramo need-recover-branch-name commitId

  3. empurre need-recover-branch-name novamente se você excluiu ramificação remota também antes

    git push origem need-recover-branch-name

Pode parecer muito cauteloso, mas eu freqüentemente fecho uma cópia do que eu tenho trabalhado antes de fazer mudanças no controle de código-fonte. Em um projeto do Gitlab em que estou trabalhando, recentemente apaguei uma ramificação remota por engano que queria manter após mesclar uma solicitação de mesclagem. Acontece que tudo que eu tive que fazer para recuperá-lo com o histórico de commits foi empurrar novamente. A solicitação de mesclagem ainda era rastreada pelo Gitlab, por isso ainda mostra o label azul “mesclado” à direita da ramificação. Eu ainda fechei minha pasta local no caso de algo ruim acontecer.