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.)


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.


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

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.