Git, як відмовити перебазу


106

У Git, як зробити відкат перебази, якщо ви не задоволені цим?

Git не має сухого запуску для перебазування. Якщо я зробив перебазу і ще не натиснув її, як мені повернутися до раніше, ніби цього ніколи не було?


4
git rebase --abort
— olibiaz

2
Що ви маєте на увазі "не вдалося"? Ви завершили перебазу, і результати вам не подобаються? Або ви потрапляли в конфлікти і хотіли зупинити перебазування посередині? Я припускаю перше, оскільки ви не можете підштовхнути конфліктну, незавершену базу даних, але я запитую, оскільки це два різні запитання.
— Едвард Томсон,

так, колишній. Дякую.
— user1615666

3
Можливий дублікат скасування git rebase
— Джон Шнайдер

Відповіді:


216

Ви можете використовувати релог, щоб знайти першу дію до початку перебази, а потім скинути - жорсткий назад до неї. напр

$ 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

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

Щоб знайти правильне місце для скидання, просто виберіть найближчий запис, який не починається з "перебазувати".

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

Якщо перебаза - це єдине, що ви зробили у гілці, тобто у вас немає невідправлених комітів / змін - тоді ви можете просто видалити локальну гілку за допомогою, 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 вище, щоб повернутися до запису рефлог, де ви зробили коміти.


11
Ще один зручний ярлик: rebase встановлює ORIG_HEADвихідне хеш-значення гілки, що перебазується. Тож замість того, щоб знайти число 2 для HEAD@{2}, ви можете просто використовувати ORIG_HEAD... але лише якщо ORIG_HEADце все ще не порушено. Набір команд Git встановлює його (rebase, am, reset і merge, за різних обставин).
— Торек

1
Спасибі пане! Велика допомога в цьому :)
— Алек,

1
дякую моєму вихідному коду назад .... після використання цього $ git reset HEAD @ {2} --hard
— reza rahmad

Отримує мій голос за те, що я пропоную просто видалити локальну гілку і витягнути її знову!
— quicklikerabbit

1
Це рятувальник життя. Дякую @Robbie
— Nelson Katale

42

Rebase зберігає резервну копію старого стану як ORIG_HEAD.
Таким чином, ви можете повернути останню базу даних, запустивши:

git reset --hard ORIG_HEAD

1
Ви випадково знаєте, де цей тег задокументований?
— Ben S

У цьому є якийсь мінус, чи це нова функція? Це здається набагато простішим, ніж перебирати переробку.
— 1252748,

Це не нове. Але ви зазвичай використовуєте його відразу після перебазування, не можете повернутися назад після декількох перебаз і т. Д. У цих складних ситуаціях ви шукали б релог, але просто "ой, що я щойно зробив? Як я можу повернути це зараз? " це працює чудово.
— Меліджі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.