11

Я просто по ошибке запустил 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 , потому что я могу получить commit aaaaaaa из git reflog . Тем не менее, я не смог получить commit bbbbbbb потому что я не тянул до git push -f .

Я пробовал git reflog в удаленном репозитории, но нет ничего полезного в reflog в пустом репозитории.

Как я могу восстановить ветку foo обратно, чтобы зафиксировать bbbbbbb в удаленном репозитории?

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

2 ответа2

11

Попробуй это:

  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 чтобы убедиться, что вы восстановили правильные ветви.

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .