Undoing merge or pull in Git

Undo pull and recover to previous HEAD commit

If you want to undo git pull action which has been executed and go back to the previous state, use :

# Undo pull action
# --hard, not only reset the current branch and staging area, but also working directory
# ORIG_HEAD, the old HEAD, here it is the HEAD before pull action
$ git reset --hard ORIG_HEAD

Undo pull but keep unstaged changes in working directory

Note the command above will discard changes you have made in working directory. If you have not staged them and want to keep, use --merge option instead :

# Undo pull action but keep unstaged changes in working directory
$ git reset --merge ORIG_HEAD  

Discarding changes in working directory in Git

To discard changes in working tree to make it clean, a safer way is to use stash command. stash takes the changes in working directory away and you can get them back later.

# Stash changes in working directory
$ git stash

# Apply the latest stashed changes
$ git stash apply

Read stashing changes for more about how to use stash.

If you still want to discard the changes directly, use below command (Changes can not be recovered):

# Discard the changes in working directory and staging area.
# Be aware that changes can not be recovered.
$ git reset --hard

Undoing add in Git

If you add a file to staging area and want to undo the action, use below command :

# Undo add action for a file
# --, the following parameter will be parsed as a file path
$ git reset HEAD -- <file-path>

# Examples:

# Undo add action for index.php
$ git reset -- index.php

If you want to undo add action for all files added to staging area :

$ git reset HEAD

If fact, git status tells you how to unstage a file :

$ git add index.php
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:    index.php

Undoing a commit in Git

Undo a commit in Git. Last updated: 2018-12-14

Undo a commit that hasn’t been push yet

If you made some mistakes in a commit, you can redo it in a new commit using --amend option. Just fix your mistakes, stage(add) them and make a new commit as below:

# Redo the last commit.
# --amend, replace the last commit with a new one.
$ git commit --amend

If above solution does not suit you, reset can be used to just undo the commit (be careful to use reset):

# Discard the last commit. The commit's modifications in working tree are kept.
$ git reset HEAD~

# Discard the last commit. The commit's modifications in staging area are kept.
$ git reset --soft HEAD~

# Discard the last commit. The commit's modifications in working tree are not kept.
$ git reset --hard HEAD~

Undo a commit that has been pushed

If a commit has been pushed to the remote repository, changing the history in the remote repository is not a good idea. You can let Git to make a new commit which reverses the modifications in the last commit.

git revert command works for you :

# Reverse a commit.
$ git revert -m 1 HEAD

Afterwards, push it to the remote repository again.