Wie kann ich mich von einem versehentlichen Git-Push -f erholen?

13

Ich bin nur versehentlich gelaufen git push -fund habe so einen Remote-Zweig überschrieben.

Original:

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

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

Nachher git push -f:

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

In meinem lokalen Repository, ich arbeite auf dem masterZweig, so dass ich die Niederlassung wiederherstellen masterzu begehen aaaaaaa, weil ich bekommen begehen kann aaaaaaaaus git reflog. Ich konnte mich jedoch nicht festlegen, bbbbbbbweil ich vorher nicht gezogen habe git push -f.

Ich habe es git reflogim Remote-Repository versucht , aber es gibt nichts Nützliches beim Reflog im Bare-Repository.

Wie kann ich den Zweig wiederherstellen foo, um ihn bbbbbbbim Remote-Repository festzuschreiben?

(PS Ich kenne den tatsächlichen Wert von nicht bbbbbbb.)

Xiè Jìléi
quelle
Aber das Remote-Repo ist ein reines Repo.
Xiè Jìléi

Antworten:

12

Versuche dies:

  1. Stellen Sie über SSH eine Verbindung zur Fernbedienung her.

  2. Erstellen Sie eine Sicherungskopie des gesamten Remote-Repositorys.

    tar cvzf project-backup.tgz /path/to/project.git
    
  3. Wenn Sie mindestens die ersten Zeichen von kennen bbbbbbb, verwenden Sie git show bbbbbbund / oder git log bbbbbb, um den vollständigen Commit-Hash herauszufinden. (Wenn Sie nur den Hash benötigen, git rev-parse bbbbbbfunktioniert dies auch, aber es ist immer besser zu überprüfen.)

    Wenn Sie den Wert nicht wissen überhaupt , laufen git fsckund Sie sollten eine Liste von „baumelnden Commits“ bekommen. Untersuchen Sie jedes Commit mit git show <hash>und, git log <hash>bis Sie das richtige gefunden haben.

  4. Aktualisieren Sie die Zweigstellenreferenzen:

    echo aaaaaaaaaaaaaaa.... > refs/heads/master
    echo bbbbbbbbbbbbbbb.... > refs/heads/foo
    
  5. Verwenden Sie git log masterund, git log fooum sicherzustellen, dass Sie die richtigen Zweige wiederhergestellt haben.

user1686
quelle
Danke, ich hatte den baumelnden Ast mit gerettet git fsck.
Xiè Jìléi
0

Es ist wahrscheinlich, dass auch andere Dienste solche anbieten. Es spart Tag.

akostadinov
quelle