Как я могу восстановиться после случайного git push -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в удаленном хранилище, но нет ничего полезного в reflog в пустом хранилище.

Как я могу восстановить ветку fooобратно для фиксации bbbbbbbв удаленном хранилище?

(PS Я не знаю фактическую стоимость bbbbbbb.)

Xiè Jìléi
источник
Но удаленное репо является голым репо.
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чтобы убедиться, что вы восстановили правильные ветви.

user1686
источник
Спасибо, я сохранил свисающую ветку с git fsck.
Xiè Jìléi
0

Вероятно, другие услуги также предоставляют такие. Это заставка дня.

akostadinov
источник