Subject: Re: Undo last commit?

From: Jakub Narebski <[email-masked]>
Date: Sat, 18 Jun 2011 06:54:50 -0700 (PDT)

Mike <[email-masked]> writes:

> Hi fellow gitters,
> 
> 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:
> 
> 
> 1. I did a 'git status' and there were files which I had 'added' ready
> for a commit. There were also some changes that had not been 'added'
> yet. See below:
> 
> % git status
> # On branch master
> # Your branch is ahead of 'origin/master' by 7 commits.
> #
> # Changes to be committed:
> #   (use "git reset HEAD <file>..." to unstage)
> #
> #	modified:   cgi-bin/example1.php
> #	modified:   cgi-bin/example2.php
> #	modified:   example3.php
> #
> # Changed but not updated:
> #   (use "git add <file>..." to update what will be committed)
> #   (use "git checkout -- <file>..." to discard changes in working directory)
> #
> #	modified:   cgi-bin/example4.php
> #	modified:   example5.php
> #
> 
> 
> 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"'.

You committed all staged changes (i.e. only those on "Changes to be
committed" list), not all changes; for that you would need to use '-a'
option to git commit.

BTW. why are you using '-m' option?
 
> 3. I googled the problem and it seems everyone has a different way of
> doing this. (Maybe git is too confusing if everyone has different
> methods that all work slightly differently!?). Anyway I executed this
> command:
> 
> % git commit --amend

You could simply use

  % git commit --amend -m "commit message" example3.php

The `--amend` just means to fix (redo) last commit.

> But I aborted this by exiting my text editor.

O.K.

> 4. I then tried:
> 
> % git reset --hard HEAD~1

Errr... here you screwed up.  This reset state of you working area to
the state at last commit, removing all your changes to tracked files.

> 5. However now when I do a 'git status' none of the files that were
> original listed are there. A git status now gives this:
> 
> # On branch master
> # Your branch is ahead of 'origin/master' by 7 commits.
> #
> nothing to commit (working directory clean)
> 
> 
> 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.

You lost your changes to files on "Changed but not updated" list,
i.e. cgi-bin/example4.php and example5.php.

What you can do is go back to your last commit (the errorneous one) by
using

  $ git reset --keep HEAD@{1}

Which means reset to last state (before 'git reset --hard HEAD~1'; you
can check it with "git reflog" or "git log -g"), keeping your local
changes (if you used '--keep' not '--hard' then you wouldn't loose
your changes).

Then redo this commit like you wanted to

  $ git commit --amend -m "commit message" example3.php

Or better

  $ git commit --amend -v example3.php

To check if you are committing correct changes.

...................

Alternatively check out state of example3.php from last made commit:

  $ git checkout HEAD@{1} -- example3.php

Do your commit

  $ git commit -m "commit message" example3.php

Get state of other files that you accidentally comitted from next to
last state of HEAD:

  $ git checkout HEAD@{2} -- cgi-bin/example1.php cgi-bin/example2.php

Unfortunately changes to cgi-bin/example4.php and example5.php are
lost.

-- 
Jakub Narebski
Poland
ShadeHawk on #git