Как в Git откатить перебазирование, если оно вас не устраивает?
В Git нет пробной версии для перебазирования. Если я выполнил перебазирование и еще не нажал на него, как мне вернуться к предыдущему состоянию, как будто этого никогда не было?
Что значит «не удалось»? Вы выполнили перебазирование, и вам не нравятся результаты? Или вы столкнулись с конфликтами и хотите остановить перебазирование посередине? Я предполагаю первое, поскольку вы не можете нажать на конфликтующую незаконченную перебазировку, но я спрашиваю, потому что это два разных вопроса.
Вы можете использовать журнал ссылок, чтобы найти первое действие до начала перебазирования, а затем сбросить --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, в которой вы сделали фиксацию (и).
Еще один удобный ярлык: для перебазирования устанавливается 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.
Таким образом, вы можете отменить последнее перебазирование, запустив:
Вы случайно не знаете, где задокументирован этот тег?
Ben S
Есть ли у этого недостатки или это новая функция? Это кажется намного проще, чем просеивать рефлог.
1252748
Это не ново. Но вы обычно используете его сразу после перезагрузки, не можете вернуться назад ретроспективно после нескольких перезагрузок и т. Д. В этих сложных ситуациях вы будете охотиться за материалом для перезагрузки, но просто «ой, что я только что сделал? Как я могу вернуться что сейчас? " он работает нормально.
Ответы:
Вы можете использовать журнал ссылок, чтобы найти первое действие до начала перебазирования, а затем сбросить --hard обратно к нему. например
Теперь вы должны вернуться к тому, что было до начала перебазирования.
Чтобы найти правильное место для сброса, вы просто выбираете ближайшую к началу запись, которая не начинается с «rebase».
Альтернативный подход
Если перебазирование - это единственное, что вы сделали в ветке, то есть у вас нет неопубликованных коммитов / изменений, вы можете просто удалить локальную ветку с помощью,
git branch -D
а затем проверить ее снова:Или для того же эффекта вы можете сбросить --hard на исходную ветку:
Если вы сделали это, пока у вас были другие не отправленные коммиты, вы потеряете их. В этом случае просто используйте подход reflog, описанный выше, чтобы вернуться к записи reflog, в которой вы сделали фиксацию (и).
источник
ORIG_HEAD
исходное значение хэша перебазируемой ветки. Поэтому вместо того, чтобы искать номер 2 дляHEAD@{2}
, вы можете просто использоватьORIG_HEAD
... но только в том случае, еслиORIG_HEAD
он еще не нарушен. Его устанавливают несколько команд Git (rebase, am, reset и merge при различных обстоятельствах).Rebase сохраняет резервную копию старого состояния как
ORIG_HEAD
.Таким образом, вы можете отменить последнее перебазирование, запустив:
источник