Git как откатить перебазирование

104

Как в Git откатить перебазирование, если оно вас не устраивает?

В Git нет пробной версии для перебазирования. Если я выполнил перебазирование и еще не нажал на него, как мне вернуться к предыдущему состоянию, как будто этого никогда не было?

user1615666
источник
4
git rebase --abort
olibiaz
2
Что значит «не удалось»? Вы выполнили перебазирование, и вам не нравятся результаты? Или вы столкнулись с конфликтами и хотите остановить перебазирование посередине? Я предполагаю первое, поскольку вы не можете нажать на конфликтующую незаконченную перебазировку, но я спрашиваю, потому что это два разных вопроса.
Эдвард Томсон
да, бывшая. Спасибо.
user1615666
3
Возможный дубликат отмены git rebase
Джон Шнайдер

Ответы:

214

Вы можете использовать журнал ссылок, чтобы найти первое действие до начала перебазирования, а затем сбросить --hard обратно к нему. например

$ git reflog

b710729 HEAD@{0}: rebase: some commit
5ad7c1c HEAD@{1}: rebase: another commit
deafcbf HEAD@{2}: checkout: moving from master to my-branch
...

$ git reset HEAD@{2} --hard

Теперь вы должны вернуться к тому, что было до начала перебазирования.

Чтобы найти правильное место для сброса, вы просто выбираете ближайшую к началу запись, которая не начинается с «rebase».

Альтернативный подход

Если перебазирование - это единственное, что вы сделали в ветке, то есть у вас нет неопубликованных коммитов / изменений, вы можете просто удалить локальную ветку с помощью, git branch -Dа затем проверить ее снова:

$ git checkout my-branch
$ git rebase master
// not happy with result
$ git checkout master
$ git branch -D my-branch
$ git checkout my-branch

Или для того же эффекта вы можете сбросить --hard на исходную ветку:

$ git reset --hard origin/my-branch

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

Робби
источник
11
Еще один удобный ярлык: для перебазирования устанавливается ORIG_HEADисходное значение хэша перебазируемой ветки. Поэтому вместо того, чтобы искать номер 2 для HEAD@{2}, вы можете просто использовать ORIG_HEAD... но только в том случае, если ORIG_HEADон еще не нарушен. Его устанавливают несколько команд Git (rebase, am, reset и merge при различных обстоятельствах).
torek
1
Спасибо, сэр! Отличный
Алек
1
спасибо, мой исходный код вернулся .... после использования этого $ git reset HEAD @ {2} --hard
reza rahmad
Получает мой голос за то, что предлагаю просто удалить локальную ветку и снова вытащить ее!
quicklikerabbit
1
Это спасатель жизни. Спасибо @Robbie
Нельсон Катале
42

Rebase сохраняет резервную копию старого состояния как ORIG_HEAD.
Таким образом, вы можете отменить последнее перебазирование, запустив:

git reset --hard ORIG_HEAD
Мелиги
источник
1
Вы случайно не знаете, где задокументирован этот тег?
Ben S
Есть ли у этого недостатки или это новая функция? Это кажется намного проще, чем просеивать рефлог.
1252748
Это не ново. Но вы обычно используете его сразу после перезагрузки, не можете вернуться назад ретроспективно после нескольких перезагрузок и т. Д. В этих сложных ситуациях вы будете охотиться за материалом для перезагрузки, но просто «ой, что я только что сделал? Как я могу вернуться что сейчас? " он работает нормально.
Meligy