How to fix "corrupted" interactive rebase?
I managed to create a little mess in my local git repository. I was trying to fix a broken commit by using the following instructions. Before running the 开发者_如何转开发"git commit --amend" (and after the git rebase --interactive) I decided that my changes were incorrect and so I executed "git reset HEAD --hard". Not a good idea, I tell you.
Now the interactive rebase seems to be "stuck". Git shows the current branch as (|REBASE-m). Every command (cd .., ls, git rebase...) inside my repository gives the following error:
cat: .git/rebase-merge/head-name: No such file or directory
Here's how git rebase --abort looks like:
$ git rebase --abort
cat: c:/_work/project/src/git/.git/rebase-merge/quiet: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/head-name: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/orig-head: No such file or directory
HEAD is now at 4c737fb Revert "Modified file names"
rm: cannot remove `c:/_work/project/src/git/.git/rebase-merge/done': Permission denied
rm: cannot remove directory `c:/_work/project/src/git/.git/rebase-merge': Directory
not empty
cat: .git/rebase-merge/head-name: No such file or directory
Here's the result of git rebase --continue:
$ git rebase --continue
cat: c:/_work/project/src/git/.git/rebase-merge/prev_head: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/end: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/msgnum: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/onto: No such file or directory
cat: c:/_work/project/src/git/.git/rebase-merge/quiet: No such file or directory
prev_head must be defined
cat: .git/rebase-merge/head-name: No such file or directory
Any ideas? I would like to reset the situation back to the state it was before I started my well-thought rebase operation.
Here's how git log --oneline shows the situation:
4c737fb Revert "Modified file names"
247ac02 Modified file names
33141e6 Message modifications
10a4a04 Modified db script
And this is fine.
I'm using msysgit v1.7.0.2.
I got stuck in this. I created the head-name file, and then I ran into another error saying it couldn't find the onto file, so I created that file. Then I got another error saying could not read '.git/rebase-apply/onto': No such file or directory.
So I looked at the git documentation for rebasing and found another command:
git rebase --quit
This set me back on my branch with no changes, and I could start my rebase over again, good as new.
It looks like Git tried to remove the .git/rebase-merge
directory but wasn't able to remove it completely. Have you tried copying that folder away? Also copy away the .git/rebase-apply
folder if that is present.
I had a similar problem due to a zombie vim.exe process.
Killing it in Task Manager, followed by a git rebase --abort
fixed it.
Thanks @Laura Slocum for your answer
I messed things up while rebasing and got a detached HEAD with an
error: could not read orig-head
that prevented me from finishing the rebasing.
The detached HEAD seem to contain precisely my correct rebase desired state, so I ran
rebase --quit
and after that I checked out a new temp branch to bind it to the detached head.
By comparing it with the branch I wanted to rebase, I can see the new temp branch is exactly in the state I wanted to reach. Thanks
Had same problem in Eclipse. Could not Rebase=>abort from Eclipse.
Executing git rebase --abort from Git Bash Worked for me.
On Windows, if you are unwilling or unable to restart the machine see below.
Install Process Explorer: https://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
In Process Explorer, Find > File Handle or DLL ...
Type in the file name mentioned in the error (for my error it was 'git-rebase-todo' but in the question above, 'done').
Process Explorer will highlight the process holding a lock on the file (for me it was 'grep').
Kill the process and you will be able to abort the git action in the standard way.
Create a file with this name:
touch .git/rebase-merge/head-name
and than use git rebase
In my case eighter git rebase --abort
and git rebase --continue
was throwing:
error: could not read '.git/rebase-apply/head-name': No such file or directory
I managed to fix this issue by manually removing: .git\rebase-apply
directory.
I'm using git version 2.19.2.windows.1
.
the only thing that worked for me was to remove the .git/rebase-apply/
directory and do a git reset --hard
.
I have tried all the above steps mentioned but nothing worked for me. Finally, restarting the computer worked for this issue :D
With SublimeText 3 on Windows, the problem is fixed by just closing the Sublime windows used for interactive commit edition.
If you get below state and rebase does not work anymore,
$ git status
rebase in progress; onto (null)
You are currently rebasing.
(all conflicts fixed: run "git rebase --continue")
Then first run,
$ git rebase -quit
And then restore previous state from reflog,
$ git reflog
97f7c6f (HEAD, origin/master, origin/HEAD) HEAD@{0}: pull --rebase: checkout 97f7c6f292d995b2925c2ea036bb4823a856e1aa
4035795 (master) HEAD@{1}: commit (amend): Adding 2nd commit
d16be84 HEAD@{2}: commit (amend): Adding 2nd commit
8577ca8 HEAD@{3}: commit: Adding 2nd commit
3d2088d HEAD@{4}: reset: moving to head~
52eec4a HEAD@{5}: commit: Adding initial commit
Using,
$ git checkout HEAD@{1} #or
$ git checkout master #or
$ git checkout 4035795 #or
In my case it was because I had opened SmartGit's Log in the respective Git project and Total Commander in the respective project directory. When I closed both I was able to rebase without any problem.
The more I think about it, the more I suspect Total Commander, i.e. Windows having a lock on opened directory the git rebase was trying to something with.
Friendly advice: When you try to fix something, always do one change at a time. ;)
Once you have satisfactorily completed rebasing X number of commits , the last command must be git rebase --continue
. That completes the process and exits out of the rebase mode .
I had the same problem. I used process explorer as suggested in other post (i am not able to find that post) and figured out which process has a lock on the file and kill it. then execute the --continue or --abort as per needs
In my case after testing all this options and still having issues i tried sudo git rebase --abort
and it did the whole thing
tried everything else but a reboot, what worked for me is rm -fr .git/REBASE_HEAD
I had a commit running in my VSCode that made it stuck. killed the VS Code process and did recover (R) to the rebase. Fixed it for me.
I am using git in eclipse and I was having the same problem.
Eventually I found that the "Rebase ..." menu entry was temporarily transformed into a sub-menu.
Team-> Rebase -> Abort
It worked for me.
精彩评论