Come posso recuperare da un git push accidentale -f?


13

Ho appena corso git push -fper errore, sovrascrivendo così un ramo remoto.

Originale:

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

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

Dopo git push -f:

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

Nel mio repository locale, sto lavorando sul masterramo, quindi posso ripristinare il ramo masterper il commit aaaaaaa, perché posso ottenere il commit aaaaaaada git reflog. Tuttavia, non sono riuscito a impegnarmi bbbbbbbperché non l'ho mai fatto prima git push -f.

Ho provato git reflognel repository remoto, ma non c'è nulla di utile nel reflog nel repository nudo.

Come posso ripristinare il ramo fooper eseguire bbbbbbbil commit nel repository remoto?

(PS Non conosco il valore reale di bbbbbbb.)


Ma il repository remoto è un repository nudo.
Xiè Jìléi,

Risposte:


12

Prova questo:

  1. Connettiti al telecomando tramite SSH.

  2. Eseguire un backup dell'intero repository remoto.

    tar cvzf project-backup.tgz /path/to/project.git
    
  3. Se conosci almeno i primi caratteri di bbbbbbb, usa git show bbbbbbe / o git log bbbbbbper scoprire l'hash di commit completo. (Se hai bisogno solo dell'hash, git rev-parse bbbbbbfunzionerà anche, ma è sempre meglio controllare.)

    Se non si conosce il valore a tutti , correre git fscke si dovrebbe ottenere un elenco di "commit penzoloni". Esamina ogni commit usando git show <hash>e git log <hash>fino a trovare quello corretto.

  4. Aggiorna i riferimenti delle filiali:

    echo aaaaaaaaaaaaaaa.... > refs/heads/master
    echo bbbbbbbbbbbbbbb.... > refs/heads/foo
    
  5. Utilizzare git log mastere git log fooper assicurarsi di aver ripristinato i rami corretti.


Grazie, avevo salvato il ramo penzolante con git fsck.
Xiè Jìléi,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.