Comment récupérer d'un git push -f accidentel?

13

J'ai simplement couru git push -fpar erreur, écrasant ainsi une branche distante.

Original:

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

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

Après git push -f:

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

Dans mon référentiel local, je travaille sur la masterbranche, je peux donc restaurer la branche masterà valider aaaaaaa, car je peux obtenir la validation à aaaaaaapartir de git reflog. Cependant, je n'ai pas pu m'engager bbbbbbbparce que je n'avais pas tiré avant git push -f.

J'ai essayé git reflogdans le référentiel distant, mais il n'y a rien d'utile dans reflog dans le référentiel nu.

Comment restaurer la branche foopour la valider bbbbbbbdans le référentiel distant?

(PS, je ne connais pas la valeur réelle de bbbbbbb.)

Xiè Jìléi
la source
Mais le repo distant est un repo nu.
Xiè Jìléi

Réponses:

12

Essaye ça:

  1. Connectez-vous à la télécommande via SSH.

  2. Effectuez une sauvegarde de l'ensemble du référentiel distant.

    tar cvzf project-backup.tgz /path/to/project.git
    
  3. Si vous connaissez au moins les premiers caractères de bbbbbbb, utilisez git show bbbbbbet / ou git log bbbbbbpour découvrir le hachage de validation complet. (Si vous n'avez besoin que du hachage, git rev-parse bbbbbbcela fonctionnera également, mais il est toujours préférable de vérifier.)

    Si vous ne connaissez pas la valeur du tout , courir git fscket vous devriez obtenir une liste de « ballants commits ». Examinez chaque validation à l'aide de git show <hash>et git log <hash>jusqu'à ce que vous trouviez la bonne.

  4. Mettez à jour les références de branche:

    echo aaaaaaaaaaaaaaa.... > refs/heads/master
    echo bbbbbbbbbbbbbbb.... > refs/heads/foo
    
  5. Utilisez git log masteret git log foopour vous assurer que vous avez restauré les branches correctes.

user1686
la source
Merci, j'avais sauvé la branche pendante avec git fsck.
Xiè Jìléi
0

Il est probable que d'autres services en fournissent également. C'est un épargnant de jour.

akostadinov
la source