Git - How to fix a bad commit

Git - How to fix a bad commit

Oh no, this commit is a mess! 🤦‍♂️

We all have a bad day sometimes. We can forget to include a file, leave some comments, or a merge didn't go as expected. Fortunately, Git has some commands to deal with these common situations and I want to show you some of them.

Modify commit message

Oops... You found a spelling mistake in the commit message. No worries, you can modify it:

git commit --amend -m "new message"

Add files to last commit

You already have committed the changes but forgot to add some files. No problem, you can still add them to the commit:

git add <file_name>
git commit --amend HEAD~1

Undo commits

If you want to undo the last commit but keep the changes:

git reset --soft HEAD~1

If you want to undo both commit and changes: ⚠️ Be sure that you want to lose the changes:

git reset --hard HEAD~1

Alternatively, if you want to undo all your local changes, you can reset to the origin version of the branch:

git reset --hard origin/<branch_name>

If you want to undo the commit without altering the existing history. You can use git revert, this command undoes a commit by creating a new commit:

git revert HEAD

If you have just resolved some conflicts, finished the merge, and push to origin. But wait, something went wrong...

The safe way to undo a merge commit that has already pushed to the remote branch is using the git revert command:

git revert -m 1 <commit_id>

commit_id is the merge commit id that you want to revert.

Notes:

  • You can also undo any number of commits. E.g:

    • git reset HEAD~3 (going back three commits before HEAD).
    • git reset --hard <commit_id> (going back to a specific commit).
  • Use git reset if the commit is not pushed yet and you don't want to introduce a bad commit to the remote branch.

  • Use git revert to revert a merge commit that has already pushed to the remote branch.

  • Use git log to review the commit history.

  • If you prefer, you can also create a new commit with the fix.

I hope you find these commands as useful as I do and can use them. If you already knew these or think one is missing, please let me know in the comments. Thanks for reading!