1138

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 ?

SecretAgentMan
  • 2,690
  • 6
  • 16
  • 35
seg.server.fault
  • 15,608
  • 12
  • 32
  • 31
  • 25
    It looks like you only have two things in your history: a clone and a fetch. Just reset to the clone: `git reset --hard 01b34fa`, in this case you could have done `git reset --hard HEAD^` which resets to one commit before the HEAD. – jkp Aug 03 '09 at 16:57
  • 2
    --hard is necessary if you want to modify files in your working dir – William Pursell Aug 03 '09 at 17:02
  • 3
    @seg.server.fault: if it worked, you can always accept the answer ;) – jkp Aug 03 '09 at 17:29
  • 8
    git reset --hard HEAD^ – funroll Sep 16 '13 at 15:48
  • 7
    `git reflog` will show everything what have been done with git. There is a concern that `git reset --hard [sha1 of something from reflog]` will revert everything what is shown in `reflog`, which sometimes are not goal, eg. you want to revert merge on master branch pulled from origin with bad data (happens), and after that merge you have worked on other branches. `reflog` will show every chage on other branches. But `git checkout master` and `git reset --hard [SH1 of commit on master branch just before merge]` will reset only current master branch removing pulled merge from origin. – Vladimir Vukanac Jul 14 '15 at 10:54
  • It's good to get out of the `git pull` habit. Always use `git fetch` and then intelligently decide on what to do next. – Kaz Jul 27 '16 at 18:00
  • I have adde the latest answer ! – Manish Goswami Jun 28 '19 at 05:37
  • Saw `999` votes so without reading I had to vote up for a round `1000` (mild OCD) – vsync May 18 '20 at 14:50
  • Another alternative way for HEAD^ is `git reset --hard HEAD~1` – Zelalem Mar 15 '21 at 11:00

12 Answers12

1658

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"}
Dave Jarvis
  • 28,853
  • 37
  • 164
  • 291
jkp
  • 70,446
  • 25
  • 98
  • 102
  • 342
    An excellent way to pick the previous state, instead of using git-reflog and copying hashes, is to use a shortcut like `master@{1}`, which is the previous position of `master`, `master@{"5 minutes ago"}`, or `master@{14:30}`. Full details on specifying revisions in this way can be found in `man git-rev-parse`, in the section called "specifying revisions". – Cascabel Aug 03 '09 at 17:16
  • 39
    In this case ORIG\_HEAD should also work ("git reset --hard ORIG\_HEAD") – Jakub Narębski Aug 03 '09 at 17:27
  • @Jelfromi: thanks for that tip, I wasn't aware you could be so verbose about revisions. I knew about picking revisions relative to HEAD, but when the question was posed I didn't knowhow far back in time he wanted to go. – jkp Aug 03 '09 at 17:27
  • When I pulled, it says `Updating d2c90a3..035ac4d`. Here, you can also use `d2c90a3` as a parameter to reset. – Thai Oct 02 '13 at 06:28
  • You don't need to type hashes when you use reflog. You can also use HEAD@{1} or what ever previous number as defined in the reflog. – Simon The Cat Mar 31 '14 at 12:06
  • When I type `git reflog` I don't see anything about merges in there. The most recent things are checkouts and before that is stuff I was doing before `git pull`. Can you give me a better clue as to how to find this merge SHA-1? – Daniel Kaplan Feb 19 '15 at 02:13
  • **WARNING** : `git reset --hard master@{"10 minutes ago"}` also deletes all the changes that are not staged yet! – Muhammad Jun 18 '20 at 04:46
398

Same as jkp's answer, but here's the full command:

git reset --hard a0d3fe6

where a0d3fe6 is found by doing

git reflog

and looking at the point at which you want to undo to.

Jeffrey Sun
  • 6,399
  • 1
  • 21
  • 17
145

A more modern way to undo a merge is:

git merge --abort

And the slightly older way:

git reset --merge

The old-school way described in previous answers (warning: will discard all your local changes):

git reset --hard

But actually, it is worth noticing that git merge --abort is only equivalent to git reset --merge given that MERGE_HEAD is present. This can be read in the git help for merge command.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

After a failed merge, when there is no MERGE_HEAD, the failed merge can be undone with git reset --merge but not necessarily with git merge --abort, so they are not only old and new syntax for the same thing. This is why i find git reset --merge to be much more useful in everyday work.

Martin G
  • 14,280
  • 9
  • 69
  • 82
71

it works first use: git reflog

find your SHA of your previus state and make (HEAD@{1} is an example)

git reset --hard HEAD@{1}
Ezequiel García
  • 2,246
  • 14
  • 11
42

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.

Samuel Carrijo
  • 16,127
  • 11
  • 45
  • 59
41

Suppose $COMMIT was the last commit id before you performed git pull. What you need to undo the last pull is

git reset --hard $COMMIT

.

Bonus:

In speaking of pull, I would like to share an interesting trick,

git pull --rebase

This above command is the most useful command in my git life which saved a lots of time.

Before pushing your newly commit to server, try this command and it will automatically sync latest server changes (with a fetch + merge) and will place your commit at the top in git log. No need to worry about manual pull/merge.

Find details at: http://gitolite.com/git-pull--rebase

Community
  • 1
  • 1
Sazzad Hissain Khan
  • 29,428
  • 20
  • 134
  • 192
19

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}

Manish Goswami
  • 351
  • 2
  • 9
  • this response is very useful , because if we do an git pull origin branch wi get something like this ```Updating ffce65bd..e929e884```, the do ```git reset --hard ffce65bd``` – Ernesto Alfonso Mar 24 '20 at 15:00
18

you can do git reset --hard ORIG_HEAD

since "pull" or "merge" set ORIG_HEAD to be the current state before doing those actions.

Orlando
  • 8,452
  • 2
  • 53
  • 48
6

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.

Davide
  • 15,535
  • 10
  • 44
  • 65
4

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).

GolamMazid Sajib
  • 6,630
  • 4
  • 17
  • 32
2

The fastest way to solve this is

git merge --abort
Azeez Bello
  • 391
  • 3
  • 6
1

Try run

git reset --keep HEAD@{1}