Thread (13 messages) flat view 13 messages, 8 authors, 2016-06-15

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help