Re: Undo last commit?
From: Ramkumar Ramachandra <hidden>
Date: 2016-06-15 22:51:29
Hi Mike, Mike writes:
I have performed a 'git commit' on all 'added' files by mistake and now I want to undo this commit to return to the original state. Here's a more detailed description:
In your situation, the "correct" answer is (arguably) 'git reset HEAD~1'. This is called a mixed reset (see git-reset(1) for more).
2. I accidentally did a commit for ALL files because I forgot to specify the filename at the end of the commit. e.g. instead of 'commit -m "commit message" example3.php' I did 'commit -m "commit message"'.
Ideally, you should only stage what you want to commit. Isn't that the reason we have a staging area?
% git commit --amend
Remember that 'git commit --amend' behaves a lot like 'git commit'; it commits your staged changes. Except, instead of making a new commit, it adds those changes to your previous commit*. It _additionally_ gives you the ability to update the commit message -- when you tried it without any staged changes, that's what you saw. Anyway, this is not a good option in your particular case; you'd essentially have to stage the inverse of all the changes you didn't intend to make in the previous commit before amending the previous commit.
% git reset --hard HEAD~1
Ouch. I'm sorry to have to be the one to give you the bad news; the changes that you didn't commit (the "unstaged changes" you showed) are lost forever**. This is quite a dangerous command, and must be used with care.
Any ideas how to rectify this issue? I presume the 'git commit --amend' just changes the commit message? I daren't try anything else myself in case I make matters worse.
First, you must find the commit you made in the reflog and cherry-pick it. See git-reflog(1) and git-cherry-pick(1). Now you've essentially undo the hard reset, sans your unstaged changes. Perform a 'git reset HEAD~1' to move your HEAD back one step, stage the correct changes before creating new commits. A series of commands: $ git reflog # Look for the commit you made before; let's call this b8bb3f $ git cherry-pick b8bb3f # Stage, unstage whatever you like $ git commit * Git never actually loses your commits unless you garbage collect, so you can still find the old commit (the one that you amended to originally) ** Okay, very difficult to recover. You'll have to find the tree object corresponding to that index state. -- Ram