Git: How to Undo commit *and* revert to last branch

Uh oh… I mistakenly committed a pretty complex change (including subdirectory and files renames) without really knowing what I am doing (or what Git would be doing).

I now want to undo everything such that:

  • GIT for a solo developer
  • Git's performance with Big Commits vs. tiny commits
  • How to configure gitolite for a single domain on Plesk
  • Error after removing submodule: The following path is ignored by one of your .gitignore files:
  • GIThub and non-english windows?
  • Untracked Files - is there an interactive mode do deal with them?
    1. commit is completely reversed (as if
      it has never been done, perhaps
      removing it from history as well)
    2. Restore current working directory
      (where .git is) to a certain
      branch (last one will do for now).

    I found references to git reset –soft and git reset –hard but I have already proven to myself that I can do real damage by prematurely using a command without fully understanding it. 🙂

    I found the git reset man page but I am still confused as to:

    1. What is HEAD?
    2. What is the difference between
      HEAD and * master?
    3. In my situation (see above) do I
      need to use --soft, --hard or
      other (3 more options)?
    4. Do I need to run another command
      (after doing git reset) to
      “finalize” the reversal?

    UPDATE: After reading the answer below:

    1. Do I understand correctly that all I
      need to do in my situation is issue
      a single command git reset --hard
    2. How do I verify that reversal was
      performed correctly?

  • Cannot change username on Gerrit, after changing github username
  • using git to keep exes and dlls?
  • Removing multiple files from a Git repo that have already been deleted from disk
  • GIT integration to show method history in Visual Studio
  • Pull specific revision from master branch?
  • How can I determine what % of git commits touch a file or directory?
  • 2 Solutions collect form web for “Git: How to Undo commit *and* revert to last branch”

    1. HEAD is the latest commit of the checked-out branch.
    2. master is a branch (the main branch, by convention) whereas HEAD is a location in history for the checked-out branch. HEAD is relative to the branch you are on.
    3. git reset --soft will leave your changes in the working tree, uncommitted for you to do whatever you like with. git reset --hard will restore the working tree to the state it was in at the commit you reset to.
    4. No other command is needed.

    First, to keep the commit in case you want to inspect it later, make a branch:

    git checkout -b my_bad_commit

    (or alternatively do git branch my_bad_commit as mentioned in larsman’s comment.)

    Then return to master or whatever branch you were on and reset:

    git checkout branch_with_bad_commit
    git reset --hard HEAD^

    HEAD^ translates to “the parent of HEAD,” which you can even stack for HEAD^^ = 2 commits back. For more on this topic, check the git community book chapter on undo in git

    1. HEAD is the tip of the current branch.
    2. The difference between HEAD and master is that HEAD changes when you checkout a branch (or commit).
    3. --soft will leave the changes around, so you can re-add/commit them or undo them by doing git checkout on the changed files. --hard will reset the working area to the state of the commit you are resetting to.
    4. Not if you reset --hard. You might have to git push --force to remote repos (although, if the changes you made are already on a remote, rewriting history is strongly discouraged).
    Git Baby is a git and github fan, let's start git clone.