Jak mogę odzyskać po przypadkowym git push-f?

11

Właśnie git push -fprzez pomyłkę uciekłem, zastępując w ten sposób zdalną gałąź.

Oryginał:

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

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

Po git push -f:

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

W moim lokalnym repozytorium pracuję nad mastergałęzią, więc mogę przywrócić gałąź masterdo zatwierdzenia aaaaaaa, ponieważ mogę uzyskać zatwierdzenie aaaaaaaz git reflog. Jednak nie mogłem uzyskać zatwierdzenia, bbbbbbbponieważ wcześniej nie ciągnąłem git push -f.

Próbowałem git reflogw zdalnym repozytorium, ale nie ma nic przydatnego w ponownym logowaniu w czystym repozytorium.

Jak mogę przywrócić gałąź foodo zatwierdzenia bbbbbbbw zdalnym repozytorium?

(PS Nie znam rzeczywistej wartości bbbbbbb.)

Xiè Jìléi
źródło
Ale zdalne repo jest zwykłym repo.
Xiè Jìléi

Odpowiedzi:

11

Spróbuj tego:

  1. Połącz się z pilotem przez SSH.

  2. Wykonaj kopię zapasową całego zdalnego repozytorium.

    tar cvzf project-backup.tgz /path/to/project.git
    
  3. Jeśli znasz przynajmniej kilka pierwszych znaków bbbbbbb, użyj git show bbbbbbi / lub, git log bbbbbbaby znaleźć pełny hash zatwierdzenia. (Jeśli potrzebujesz tylko skrótu, git rev-parse bbbbbbbędzie również działać, ale zawsze lepiej to sprawdzić).

    Jeśli nie zna wartości w ogóle uruchomić git fscki powinieneś dostać listę „zwisające zobowiązuje”. Sprawdź każde zatwierdzenie za pomocą git show <hash>i, git log <hash>aż znajdziesz właściwy.

  4. Zaktualizuj odniesienia do oddziału:

    echo aaaaaaaaaaaaaaa.... > refs/heads/master
    echo bbbbbbbbbbbbbbb.... > refs/heads/foo
    
  5. Użyj git log masteri, git log fooaby przywrócić prawidłowe gałęzie.

grawitacja
źródło
Dzięki, uratowałem zwisającą gałąź git fsck.
Xiè Jìléi
0

Prawdopodobnie inne usługi również to zapewniają. To oszczędza dzień.

akostadinov
źródło