Як я можу відновитися після випадкового натискання на git -f?


13

Я просто побіг git push -fпомилково, перезаписавши таким чином віддалену гілку.

Оригінал:

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

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

Після git push -f:

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

У моєму локальному сховищі я працюю над masterгілкою, тож я можу відновити гілку masterдля здійснення фіксації aaaaaaa, оскільки я можу отримати фіксацію aaaaaaaвід git reflog. Однак я не міг взяти на себе зобов’язання, bbbbbbbтому що раніше не тягнув git push -f.

Я спробував git reflogу віддаленому сховищі, але в голому сховищі немає нічого корисного в рефлогуванні.

Як я можу відновити гілку fooназад для фіксації bbbbbbbу віддаленому сховищі?

(PS Я не знаю фактичного значення bbbbbbb.)


Але віддалений репо - це голий репо.
Xiè Jìléi

Відповіді:


12

Спробуйте це:

  1. Підключіться до пульта через SSH.

  2. Зробіть резервну копію всього віддаленого сховища.

    tar cvzf project-backup.tgz /path/to/project.git
    
  3. Якщо ви знаєте хоча б кілька перших символів bbbbbbb, використовуйте git show bbbbbbта / або git log bbbbbbдізнайтеся повний хеш фіксації. (Якщо вам потрібен лише хеш, git rev-parse bbbbbbвін також буде працювати, але це завжди краще перевірити.)

    Якщо ви не знаєте значення взагалі , працювати , git fsckі ви повинні отримати список «обірваних фіксацій». Вивчіть кожну комісію, використовуючи git show <hash>і git log <hash>поки не знайдете правильну.

  4. Оновіть посилання на галузь:

    echo aaaaaaaaaaaaaaa.... > refs/heads/master
    echo bbbbbbbbbbbbbbb.... > refs/heads/foo
    
  5. Використовуйте git log masterта git log fooпереконайтесь, що ви відновили правильні гілки.


Дякую, я врятував звисаючу гілку git fsck.
Xiè Jìléi

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.