Восстановление после непреднамеренного пропуска во время перебазирования - PullRequest
37 голосов
/ 12 марта 2010

Я только что попытался перебазировать очень старую ветку с незначительной модификацией на мой мастер. Возникла проблема с объединением только одного из трех задействованных файлов, поэтому я бездумно --skip, подумав, что он просто пропустит этот файл, но, как оказалось, он пропустил все мои изменения и откатился вперед. Итак, теперь ребаз закончен, и мои изменения, похоже, исчезли.

Я видел вопрос о отмене ребазирования , но для меня все грешно, я вижу рефлог, но я не знаю, к какому коммиту была присоединена ветвь перед ребазой.

В любом случае мне не нужно отменять ребаз, я просто хочу иметь возможность восстановить изменения в двух файлах. Есть ли в любом случае, чтобы сделать это должным образом (если это не удастся, мне просто нужно будет восстановить вчерашнюю резервную копию моего хранилища и вручную извлечь биты).

1 Ответ

44 голосов
/ 12 марта 2010

Во-первых, сделайте tarball из вашей рабочей папки git. Это позволяет несколько раз попробовать его.

Предположим, произошло следующее

  • git checkout another-old-branch
  • git rebase master
  • некоторые проблемы (которые вы пропустили)

на данный момент вы все еще находитесь в другой ветке, и ваш журнал изменений показывает вам:

6f8348f HEAD@{0}: rebase: <commit message of last commit in another-old-branch>
e547ec0 HEAD@{1}: checkout: moving from another-old-branch to e547ec0d2a558d189464fc57192066b34ec5f28f^0
65cedf8 HEAD@{2}: checkout: moving from master to another-old-branch

Представьте, что ветки похожи на символические ссылки (или указатели), все, что нам нужно сделать, - это позволить ветке 'another-old-branch' указать на старый идентификатор фиксации. старый коммит все еще там, и он не был затронут вашим ребазом. своего рода: «эй, мерзавец, другая старая ветка - e547ec0d2, забудь обо всем, что случилось»

В нашем случае это был e547ec0d2a558d189464fc57192066b34ec5f28f, так что теперь мы должны сделать это

  • git checkout another-old-branch #, если вы еще не там
  • git reset --hard e547ec0d2a558d189464fc57192066b34ec5f28f

теперь ваша ветвь вернулась в нормальное состояние. И вы можете повторить ваш ребаз.

Обратите внимание, что ваш reflog сейчас немного сложнее, чем приведенный выше пример. но это должно быть где-то там ...

удачи!

...