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:
- commit is completely reversed (as if
it has never been done, perhaps
removing it from history as well) - Restore current working directory
(where.gitis) 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:
- What is
HEAD? - What is the difference between
HEADand* master? - In my situation (see above) do I
need to use--soft,--hardor
other (3 more options)? - Do I need to run another command
(after doinggit reset) to
“finalize” the reversal?
UPDATE: After reading the answer below:
- Do I understand correctly that all I
need to do in my situation is issue
a single commandgit reset --hard?
HEAD^ - How do I verify that reversal was
performed correctly?
HEADis the latest commit of the checked-out branch.masteris a branch (the main branch, by convention) whereasHEADis a location in history for the checked-out branch.HEADis relative to the branch you are on.git reset --softwill leave your changes in the working tree, uncommitted for you to do whatever you like with.git reset --hardwill restore the working tree to the state it was in at the commit you reset to.First, to keep the commit in case you want to inspect it later, make a branch:
(or alternatively do
git branch my_bad_commitas mentioned in larsman’s comment.)Then return to
masteror whatever branch you were on and reset: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