¿Cómo me puedo recuperar de un git push -f accidental?

13

Simplemente corrí git push -fpor error, sobrescribiendo así una rama remota.

Original:

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

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

Después git push -f:

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

En mi repositorio local, estoy trabajando en la masterbifurcación, por lo que puedo restaurar la bifurcación masterpara confirmar aaaaaaa, porque puedo obtener la confirmación aaaaaaade git reflog. Sin embargo, no pude comprometerme bbbbbbbporque no tiré antes git push -f.

He intentado git reflogen el repositorio remoto, pero no hay nada útil en reflog en el repositorio simple.

¿Cómo puedo restablecer la rama foopara confirmar bbbbbbben el repositorio remoto?

(PD: no sé el valor real de bbbbbbb).

Xiè Jìléi
fuente
Pero el repositorio remoto es un repositorio desnudo.
Xiè Jìléi

Respuestas:

12

Prueba esto:

  1. Conéctese al control remoto a través de SSH.

  2. Haga una copia de seguridad de todo el repositorio remoto.

    tar cvzf project-backup.tgz /path/to/project.git
    
  3. Si conoce al menos los primeros caracteres de bbbbbbb, use git show bbbbbby / o git log bbbbbbpara encontrar el hash de confirmación completo. (Si solo necesita el hash, git rev-parse bbbbbbtambién funcionará, pero siempre es mejor verificarlo).

    Si usted no sabe el valor en absoluto , ejecutar git fscky usted debe obtener una lista de "colgando compromete". Examine cada confirmación usando git show <hash>y git log <hash>hasta que encuentre la correcta.

  4. Actualice las referencias de rama:

    echo aaaaaaaaaaaaaaa.... > refs/heads/master
    echo bbbbbbbbbbbbbbb.... > refs/heads/foo
    
  5. Use git log mastery git log foopara asegurarse de que restauró las ramas correctas.

usuario1686
fuente
Gracias, había salvado la rama colgante con git fsck.
Xiè Jìléi
0

Es probable que otros servicios también brinden tales servicios. Es un ahorro de día.

akostadinov
fuente