Undo git pull, how to bring repos to old state

Viewed 1423643

Is there any way to revert or undo git pull so that my source/repos will come to old state that was before doing git pull ? I want to do this because it merged some files which I didn't want to do so, but only merge other remaining files. So, I want to get those files back, is that possible?

EDIT: I want to undo git merge for clarification. After seeing some answers, I did this

git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name...

Now, what should I do ? Doing git reset --hard is OK ? I don't want to screw it again, so asking for detailed steps ?

15 Answers

Running git pull performs the following tasks, in order:

  1. git fetch
  2. git merge

The merge step combines branches that have been setup to be merged in your config. You want to undo the merge step, but probably not the fetch (doesn't make a lot of sense and shouldn't be necessary).

To undo the merge, use git reset --hard to reset the local repository to a previous state; use git-reflog to find the SHA-1 of the previous state and then reset to it.

Warning

The commands listed in this section remove all uncommitted changes, potentially leading to a loss of work:

git reset --hard

Alternatively, reset to a particular point in time, such as:

git reset --hard master@{"10 minutes ago"}

If you have gitk (try running "gitk --all from your git command line"), it's simple. Just run it, select the commit you want to rollback to (right-click), and select "Reset master branch to here". If you have no uncommited changes, chose the "hard" option.

This is the easiest way to revert you pull changes.

** Warning **

Please backup of your changed files because it will delete the newly created files and folders.

git reset --hard 9573e3e0

Where 9573e3e0 is your {Commit id}

git pull do below operation.

i. git fetch

ii. git merge

To undo pull do any operation:

i. git reset --hard --- its revert all local change also

or

ii. git reset --hard master@{5.days.ago} (like 10.minutes.ago, 1.hours.ago, 1.days.ago ..) to get local changes.

or

iii. git reset --hard commitid

Improvement:

Next time use git pull --rebase instead of git pull.. its sync server change by doing ( fetch & merge).

The first thing I suggest doing is to make a copy of the project.

You can checkout a new branch(git checkout -b NewCopy) so you can have a copy and then return back to the branch where you checked out from.

Run this command to view git reference.

git reflog

It will display your reference log and commit_Id {something like e0371eb} that you can use to go back to a particular reference point.

Run this command to backtrack to a point

git reset --hard 7316f34  //replace that with your commit id

I suggest having 2 terminal open,one to display the log and the other to run the command

If there is a failed merge, which is the most common reason for wanting to undo a git pull, running git reset --merge does exactly what one would expect: keep the fetched files, but undo the merge that git pull attempted to merge. Then one can decide what to do without the clutter that git merge sometimes generates. And it does not need one to find the exact commit ID which --hard mentioned in every other answer requires.

For reverting the last merge to your custom-branch, the easiest method is:

git reset --hard custom-branch@{1}

Example for main branch:

git reset --hard main@{1}

do this to cancel your merge action : git merge --abort.

see the logs in your current branch where you performed git pull command

git log

the sample output will be look like this

commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxa3dd0
Author: user <user@gmail.com>
Date:   Tue Nov 23 20:19:58 2021 +0530

    latest changes

commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxd697b
Author: user <user@gmail.com>
Date:   Tue Nov 23 17:45:44 2021 +0530

    latest changes includes account details api

commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxc0e6fa
Author: user <user@gmail.com>
Date:   Tue Nov 23 17:02:39 2021 +0530

    latest changes

copy the last commit id you wish to want. for example if your last commit id is xxxxxxxxxxxxxxxxxxxxxxxxxxxxxc0e6fa(assuming this commit id was the last commit id before you performed git pull) and two commits above this commit id is came after your git pull command use this commit id to get your previous changes

git reset --hard xxxxxxxxxxxxxxxxxxxxxxxxxxxxxc0e6fa

doing this will remove the commits above this commit id. you will get you previous changes after this, just as simple as that.

Related