Como posso me recuperar de um git acidental push -f?

11

Eu apenas corri git push -fpor 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

Depois git push -f:

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

No meu repositório local, estou trabalhando na masterramificação, para que eu possa restaurar a ramificação mastercomo commit aaaaaaa, porque posso obter commit aaaaaaade git reflog. No entanto, não consegui me comprometer bbbbbbbporque não puxei antes git push -f.

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

Como posso restaurar o ramo de foovolta para confirmar bbbbbbbno repositório remoto?

(PS eu não sei o valor real de bbbbbbb.)

Xiè Jìléi
fonte
Mas o repositório remoto é um repositório nua.
Xiè Jìléi

Respostas:

11

Tente isto:

  1. Conecte-se ao controle remoto por meio do SSH.

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

    tar cvzf project-backup.tgz /path/to/project.git
    
  3. Se você conhece pelo menos os primeiros caracteres bbbbbbb, use git show bbbbbbe / ou git log bbbbbbpara descobrir o hash de commit completo. (Se você precisar apenas do hash, git rev-parse bbbbbbtambém funcionará, mas é sempre melhor verificar.)

    Se você não sabe o valor em tudo , executar git fscke você deve obter uma lista de "commits pendentes". 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 mastere git log foopara garantir que você restaurou os ramos corretos.

grawity
fonte
Obrigado, eu salvei o ramo pendente com git fsck.
Xiè Jìléi
0

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

Akostadinov
fonte