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


104

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

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.