Undoing a git rebase
Does anybody know how to easily undo a git rebase?
The only way that comes to mind is to go at it manually:
In my current situation this is gonna work because I can easily spot commits from both branches (one was my stuff, the other was my colleague's stuff).
However my approach strikes me as suboptimal and error-prone (let's say I had just rebased with 2 of my own branches).
Any ideas?
Clarification: I'm talking about a rebase during which a bunch of commits were replayed. Not only one.
The easiest way would be to find the head commit of the branch as it was immediately before the rebase started in the reflog...
git reflog
and to reset the current branch to it (with the usual caveats about being absolutely sure before reseting with the --hard
option).
Suppose the old commit was HEAD@{5}
in the ref log:
git reset --hard HEAD@{5}
In Windows, you may need to quote the reference:
git reset --hard "HEAD@{5}"
You can check the history of the candidate old head by just doing a git log HEAD@{5}
(Windows: git log "HEAD@{5}"
).
If you've not disabled per branch reflogs you should be able to simply do git reflog branchname@{1}
as a rebase detaches the branch head before reattaching to the final head. I would double check this, though as I haven't verified this recently.
Per default, all reflogs are activated for non-bare repositories:
[core]
logAllRefUpdates = true
Actually, rebase saves your starting point to ORIG_HEAD
so this is usually as simple as:
git reset --hard ORIG_HEAD
However, the reset
, rebase
and merge
all save your original HEAD
pointer into ORIG_HEAD
so, if you've done any of those commands since the rebase you're trying to undo then you'll have to use the reflog.
Charles's answer works, but you may want to do this:
git rebase --abort
to clean up after the reset
.
Otherwise, you may get the message “ Interactive rebase already started
”.
上一篇: 将现有的未提交的工作移至Git中的新分支
下一篇: 撤消git rebase