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.