How to undo "git commit --amend" done instead of "git commit"
GitCommitUndoGit AmendGit Problem Overview
I accidentally amended my previous commit. The commit should have been separate to keep history of the changes I made to a particular file.
Is there a way to undo that last commit? If I do something like git reset --hard HEAD^
, the first commit also is undone.
(I have not yet pushed to any remote directories)
Git Solutions
Solution 1 - Git
What you need to do is to create a new commit with the same details as the current HEAD
commit, but with the parent as the previous version of HEAD
. git reset --soft
will move the branch pointer so that the next commit happens on top of a different commit from where the current branch head is now.
# Move the current head so that it's pointing at the old commit
# Leave the index intact for redoing the commit.
# HEAD@{1} gives you "the commit that HEAD pointed at before
# it was moved to where it currently points at". Note that this is
# different from HEAD~1, which gives you "the commit that is the
# parent node of the commit that HEAD is currently pointing to."
git reset --soft HEAD@{1}
# commit the current tree using the commit details of the previous
# HEAD commit. (Note that HEAD@{1} is pointing somewhere different from the
# previous command. It's now pointing at the erroneously amended commit.)
git commit -C HEAD@{1}
Solution 2 - Git
use the ref-log:
git branch fixing-things HEAD@{1}
git reset fixing-things
you should then have all your previously amended changes only in your working copy and can commit again
to see a full list of previous indices type git reflog
Solution 3 - Git
Find your amended commits by:
git log --reflog
Note: You may add --patch
to see the body of the commits for clarity. Same as git reflog
.
then reset your HEAD to any previous commit at the point it was fine by:
git reset SHA1 --hard
Note: Replace SHA1 with your real commit hash. Also note that this command will lose any uncommitted changes, so you may stash them before. Alternatively, use --soft
instead to retain the latest changes and then commit them.
Then cherry-pick the other commit that you need on top of it:
git cherry-pick SHA1
Solution 4 - Git
None of these answers with the use of HEAD@{1}
worked out for me, so here's my solution:
git reflog
d0c9f22 HEAD@{0}: commit (amend): [Feature] - ABC Commit Description
c296452 HEAD@{1}: commit: [Feature] - ABC Commit Description
git reset --soft c296452
Your staging environment will now contain all of the changes that you accidentally merged with the c296452 commit.
Solution 5 - Git
If you have pushed the commit to remote and then erroneously amended changes to that commit this will fix your problem. Issue a git log
to find the SHA before the commit. (this assumes remote is named origin). Now issue these command using that SHA.
git reset --soft <SHA BEFORE THE AMMEND>
#you now see all the changes in the commit and the amend undone
#save ALL the changes to the stash
git stash
git pull origin <your-branch> --ff-only
#if you issue git log you can see that you have the commit you didn't want to amend
git stash pop
#git status reveals only the changes you incorrectly amended
#now you can create your new unamended commit
Solution 6 - Git
You can always split a commit, From the manual
- Start an interactive rebase with git rebase -i commit^, where commit is the commit you want to split. In fact, any commit range will do, as long as it contains that commit.
- Mark the commit you want to split with the action "edit".
- When it comes to editing that commit, execute git reset HEAD^. The effect is that the HEAD is rewound by one, and the index follows suit. However, the working tree stays the same.
- Now add the changes to the index that you want to have in the first commit. You can use git add (possibly interactively) or git-gui (or both) to do that.
- Commit the now-current index with whatever commit message is appropriate now.
- Repeat the last two steps until your working tree is clean.
- Continue the rebase with git rebase --continue.
Solution 7 - Git
Possibly worth noting that if you're still in your editor with the commit message, you can delete the commit message and it will abort the git commit --amend
command.
Solution 8 - Git
Maybe can use git reflog
to get two commit before amend and after amend.
Then use git diff before_commit_id after_commit_id > d.diff
to get diff between before amend and after amend.
Next use git checkout before_commit_id
to back to before commit
And last use git apply d.diff
to apply the real change you did.
That solves my problem.
Solution 9 - Git
You can do below to undo your git commit —amend
git reset --soft HEAD^
git checkout files_from_old_commit_on_branch
git pull origin your_branch_name
====================================
Now your changes are as per previous. So you are done with the undo for git commit —amend
Now you can do git push origin <your_branch_name>
, to push to the branch.
Solution 10 - Git
Almost 9 years late to this but didn't see this variation mentioned accomplishing the same thing (it's kind of a combination of a few of these, similar to to top answer (https://stackoverflow.com/a/1459264/4642530).
Search all detached heads on branch
git reflog show origin/BRANCH_NAME --date=relative
Then find the SHA1 hash
Reset to old SHA1
git reset --hard SHA1
Then push it back up.
git push origin BRANCH_NAME
Done.
This will revert you back to the old commit entirely.
(Including the date of the prior overwritten detached commit head)
Solution 11 - Git
Step 1:
run this command
git reflog
Output
1111111 HEAD@{0}: commit (amend): [Feature] - Amended commit Description
2222222 HEAD@{1}: commit: [Feature] - ABC Commit Description
Step 2:
now you go to HEAD@{1}
to uncommit amened commit by run this commit
git reset --soft 2222222
Solution 12 - Git
-
Checkout to temporary branch with last commit
git branch temp HEAD@{1}
-
Reset last commit
git reset temp
-
Now, you'll have all files your commit as well as previous commit. Check status of all the files.
git status
-
Reset your commit files from git stage.
git reset myfile1.js
(so on) -
Reattach this commit
git commit -C HEAD@{1}
-
Add and commit your files to new commit.
Solution 13 - Git
Simple Solution Solution Works Given: If your HEAD commit is in sync with remote commit.
- Create one more branch in your local workspace, and keep it in sync with your remote branch.
- Cherry pick the HEAD commit from the branch (where git commit --amend) was performed onto the newly created branch.
The cherry-picked commit will only contain your latest changes, not the old changes. You can now just rename this commit.