Skip to main content

git revert vs git reset

Basically, there are three ways to undo a commit:

  1. git reset --hard <commit_hash>
  2. git rebase -i --> then use delete command in interactive mode
  3. git revert <commit_hash>

git reset --hard <commit_hash>

git reset --hard <commit_hash> is a command that allows you to reset the current branch to a specific commit. Or using git reset --hard HEAD~3 to reset the current branch to the 3rd commit before the current commit. See the following example:

git reset --hard HEAD~2 # or
git reset --hard hashNumber2
Before reset
After reset

We are not able to only delete particular commit using "reset" command. We can only delete all commits after the specified commit.

git rebase -i

git rebase -i is a command that allows you to interactively rebase the current branch. It is often used when you want to delete a commit from the commit history.

We will be brought to an iteractive mode when we use git rebase -i HEAD~3 command. We can then use delete command to delete the commit from the commit history.

Example
pick 1cf1da5 #2
pick e4af9d6 #3
pick 352c1ac Revert "#2"

# Rebase 44dd3fa..352c1ac onto 44dd3fa (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous
# commit's log message, unless -C is used, in which case
# keep only this commit's message; -c is same as -C but
# opens the editor
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified); use -c <commit> to reword the commit message
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.

If we are working on a shared branch, we should not use git rebase -i command to delete a commit from the commit history. It is because git rebase -i rewrites the commit history. It will cause conflicts when other developers try to push their commits to the remote repository. Instead, we should use git revert command.

git revert

git revert is a command that allows you to revert a commit without rewriting the commit history. It is often used when you want to undo a commit that has been pushed to the remote repository. It creates a new commit that undoes the changes from the specified commit. See the following example:

git revert hashNumber2
Before reset
After reset