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.)


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.


Dzięki, uratowałem zwisającą gałąź git fsck.
Xiè Jìléi

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.