Очень быстрый и простой способ отменить git rebase
- это вернуть ярлыки ответвления.
Если вы уверены, что хотите отказаться от текущего сообщения version2
, вы можете начать с git reflog
(как и вы). Я буду включать rebase
шаг здесь, и я оставлю в нескольких «реальных» сокращенных рефов:
$ git checkout branch
$ git rebase --onto master start-after branch
... rebase output ...
# oops! dag-nab-it! didn't mean to do that!
$ git reflog
<rev..> [email protected]{0}: rebase finished: returning to refs/heads/branch
<rev..> [email protected]{1}: rebase: some commit msg...
05f7dc8 [email protected]{2}: rebase: checkout master
aa4e140 [email protected]{3}: checkout: moving from master to branch
Здесь aa4e140
находится где HEAD
филиала было. Эта функция также доступна в ORIG_HEAD
:
$ git log -1 --oneline ORIG_HEAD
aa4e140 some commit msg...
(больше использовать журнал, если вам нужно, чтобы убедиться, что вы собираетесь в нужном месте.)
Если вы сделали какой-нибудь другой мерзавец вещи, так как rebase, ORIG_HEAD
, возможно, были перемещены, но reflog будет иметь правильное значение. Если ORIG_HEAD
и то, что вы видите в рефлоге, согласны, вы определенно имеете правильное значение. В любом случае, убедитесь, что у вас есть правильное значение (и что у вас нет никаких сохраненных изменений, что git status
чист - вы можете использовать git stash
, если необходимо, здесь).
Также попробуйте git reflog version2
, в котором будет показана история лейбла version2
.
Теперь только силой тока ветвей убедитесь, что все-таки тот, который вы хотите изменилась к цели фиксации:
$ git branch
... see that you're still on "branch" or "version2" or whatever
$ git reset --hard aa4e140
Вуаля, все обратно точно так, как они были до запуска git rebase
.
Если вы что-нибудь, чтобы изменить ORIG_HEAD
не сделано, это даже легче, чем все это:
$ git log ORIG_HEAD # make sure that's what you want
...
$ git branch # make sure you're on `version2`
...
$ git reset --hard ORIG_HEAD
HEAD is now at ...
но метод reflog
является более общим (работает около месяца после перебазирования, независимо от того, что вы сделали между ними).
(Период времени здесь настраивается; см git reflog документации истечение дня по умолчанию 30 для reflog записей «недоступно из текущего наконечнике ветви», которая, как правило, в случае старые фиксации из. . до перебазирования)
ключ к пониманию почему это работает очень просто: git rebase
держит ваш старый совершает. Он просто добавляет новые коммиты в commit-graph, затем перемещает метку. Когда ярлык перемещен, сложнее увидеть ваши старые коммиты - они не отображаются по умолчанию, они только в «reflog», но они все еще там. Верните этикетку, и новых коммитов - это те, которые не отображаются, а старые - обратно!
Вы можете узнать больше об этом в моем ответе на [Что означает «при знаке @ знак/символ/символ в Git?] (Http://stackoverflow.com/questions/17910096/what-does-the- at-sign-symbol-character-mean-in-git/17910097 # 17910097), последний раздел. –