Como posso recuperar de um git acidental push -f?

10

Acabei de executar git push -f por engano, sobrescrevendo um ramo remoto.

Original:

(remote origin:)
    branch master -> commit aaaaaaa
    branch foo    -> commit bbbbbbb

(local)
    branch master -> commit ccccccc
    branch foo    -> commit ddddddd

Após git push -f :

(remote origin:)
    branch master -> commit ccccccc
    branch foo    -> commit ddddddd

No meu repositório local, estou trabalhando na ramificação master , para que eu possa restaurar a ramificação master para confirmar aaaaaaa , porque posso obter a consolidação aaaaaaa de git reflog . No entanto, não consegui confirmar bbbbbbb porque não pus antes git push -f .

Eu tentei git reflog no repositório remoto, mas não há nada útil no reflog no repositório nulo.

Como posso restaurar a ramificação foo de volta para confirmar bbbbbbb no repositório remoto?

(P.S. não sei o valor real de bbbbbbb .)

    
por Xiè Jìléi 16.06.2011 / 12:15

2 respostas

10

Tente isto:

  1. Conecte-se ao controle remoto por SSH.

  2. Faça um backup de todo o repositório remoto.

    tar cvzf project-backup.tgz /path/to/project.git
    
  3. Se você conhecer pelo menos os primeiros caracteres de bbbbbbb , use git show bbbbbb e / ou git log bbbbbb para descobrir o hash completo de confirmação. (Se você precisar apenas do hash, git rev-parse bbbbbb também funcionará, mas é sempre melhor verificar.)

    Se você não souber o valor de todo , execute git fsck e você deverá obter uma lista de "pendentes de commits". Examine cada commit usando git show <hash> e git log <hash> até encontrar o correto.

  4. Atualize as referências de ramificação:

    echo aaaaaaaaaaaaaaa.... > refs/heads/master
    echo bbbbbbbbbbbbbbb.... > refs/heads/foo
    
  5. Use git log master e git log foo para garantir que você restaurou as ramificações corretas.

por 16.06.2011 / 14:17
0

É provável que outros serviços também forneçam tal. É um dia de poupança.

    
por 31.03.2018 / 17:12