git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Undo last commit?

From
Ramkumar Ramachandra <artagnon@gmail.com>
Date
Jun 18, 2011, 13:48 UTC
Message-ID
<BANLkTinDBDkUYb=R2USV-T0=h9a3PRcATA@mail.gmail.com>
In-Reply-To
<BANLkTinWujKYvx_fh2iBDOdMbywqzfgwUA@mail.gmail.com>
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
Previous: Ben WaltonNext: Jakub Narebski
Message 3 of 16 in “Undo last commit?”
  1. MikeJun 18, 2011
  2. Ben WaltonJun 18, 2011
  3. Ramkumar RamachandraJun 18, 2011
  4. Jakub NarebskiJun 18, 2011
  5. Jonathan NiederJun 19, 2011
  6. Jakub NarebskiJun 19, 2011
  7. Massimo MancaJun 20, 2011
  8. Holger HellmuthJun 28, 2011
  9. MikeJun 28, 2011
  10. Ramkumar RamachandraJun 30, 2011
  11. Jonathan NiederJun 30, 2011
  12. MikeJun 30, 2011
  13. Junio C HamanoJun 30, 2011
  14. Neal KreitzingerFeb 11, 2012
  15. Jakub NarebskiFeb 11, 2012
  16. Jonathan NiederFeb 11, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.