Undo git pull, how to bring repos to old state
Asked Answered
E

19

1455

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 ?

Ezmeralda answered 3/8, 2009 at 16:42 Comment(7)
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.Ceres
--hard is necessary if you want to modify files in your working dirLagan
@seg.server.fault: if it worked, you can always accept the answer ;)Ceres
git reset --hard HEAD^Adelric
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.Loraleeloralie
It's good to get out of the git pull habit. Always use git fetch and then intelligently decide on what to do next.Chidester
Another alternative way for HEAD^ is git reset --hard HEAD~1Bayou
C
2069

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"}
Ceres answered 3/8, 2009 at 16:47 Comment(10)
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".Sepoy
In this case ORIG_HEAD should also work ("git reset --hard ORIG_HEAD")Raney
@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.Ceres
When I pulled, it says Updating d2c90a3..035ac4d. Here, you can also use d2c90a3 as a parameter to reset.Assize
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.Inoculate
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?Urga
WARNING : git reset --hard master@{"10 minutes ago"} also deletes all the changes that are not staged yet!Entomophagous
WARNING ::git reset --hard master@{"10 minutes ago"} made my repo like the first commit, I lost everythingExordium
WARNING: git reset --hard master@{"10 minutes ago"} deleted almost my entire git historyGertrudegertrudis
WARNING: The comments above are so scary, that's why I checked out to my previous tag instead, hope you will have one.Schindler
C
531

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.

Cystotomy answered 22/7, 2014 at 0:39 Comment(7)
Why can't I just do git reset HEAD --hard, for instance?Winfield
@MikeC This approach allows you to go back several pulls, for instanceCrustal
I wasn't able to use the left side ids but git reset --hard HEAD@{n} workedBlayze
You should have suggested an edit to jkp's answer instead of almost replicating it here after so many years.Lebensraum
If I have this on git reflog: dab04ec HEAD@{0}, aaaaaaa HEAD@{1} and bbbbbbb HEAD@{2}. If I do git reset --hard bbbbbbbI will lost the HEAD 0 and 1 ?Elnaelnar
@pmirnd Yes, you will lose both HEAD 0 and 1.Cystotomy
- git reflog, then check the HEAD, - git reset --hard HEAD@{11} This worked for meCappadocia
O
209

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.

Osgood answered 20/5, 2015 at 9:17 Comment(4)
git merge --abort works DURING a merge, not after git pull is finished. So this answer seems irrelevant to the question.Lebensraum
git reset --merge deletes all changes not staged for commit. Found this out the hard way.Malinowski
fatal: There is no merge to abort (MERGE_HEAD missing) Does not work even during a (unsuccessful) mergeGutenberg
This was actually what i needed as i didn't have the full pull done yet. I know its not related but was still helpful in my searchingDynamiter
I
92

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}
Imperious answered 8/3, 2016 at 17:0 Comment(1)
The actual one liner that you need after you've just done a pull that has a mistake in it and you need to roll back in a hurry.Demibastion
A
60

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

Ancell answered 23/12, 2015 at 15:55 Comment(0)
G
44

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.

Glaive answered 3/8, 2009 at 16:49 Comment(1)
This is worth running if you haven't seen it. It pops up a crazy GUI.Whistle
M
28

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}

Mayor answered 13/11, 2018 at 12:51 Comment(1)
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 ffce65bdPongee
P
21

you can do git reset --hard ORIG_HEAD

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

Panlogism answered 19/8, 2015 at 16:52 Comment(0)
B
18

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 <[email protected]>
Date:   Tue Nov 23 20:19:58 2021 +0530

    latest changes

commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxd697b
Author: user <[email protected]>
Date:   Tue Nov 23 17:45:44 2021 +0530

    latest changes includes account details api

commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxc0e6fa
Author: user <[email protected]>
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.

Boffa answered 26/11, 2021 at 14:15 Comment(0)
H
17

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}
Hampshire answered 20/9, 2021 at 11:4 Comment(1)
This worked great to revert a messy rebase someone else had done. I had pulled it and with this I was able to revert that pull and get my old local branch back. Thanks.Brunelle
A
12

Try run

git reset --keep HEAD@{1}
Archivolt answered 27/8, 2020 at 18:6 Comment(0)
P
11

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

Pederast answered 5/4, 2020 at 13:38 Comment(0)
G
10

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

Gauge answered 14/7, 2021 at 6:46 Comment(0)
P
9

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

Psi answered 4/10, 2021 at 13:30 Comment(0)
F
8

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.

Fiedling answered 24/9, 2018 at 17:35 Comment(0)
D
7

This should undo git pull

git reset --hard HEAD^
Dinesh answered 8/8, 2023 at 14:26 Comment(0)
W
1

Situation

I wrongly did a git pull of another remote branch, and I got some merge conflicts.

How I can undo this action?

Solution

git reset --hard
Williams answered 22/10, 2023 at 10:19 Comment(0)
B
0

git reflog This will generate a list that looks like this:

2cae310 (HEAD -> ArunJan, origin/ArunJan) HEAD@{0}: checkout: moving from a590c01f5c2b83adcb36049f3fd590a3244fa745 to ArunJan a590c01 HEAD@{1}: checkout: moving from ArunJan to a590c01
2cae310 (HEAD -> ArunJan, origin/ArunJan) HEAD@{2}: reset: moving to HEAD
2cae310 (HEAD -> ArunJan, origin/ArunJan) HEAD@{3}: checkout: moving from 4a41a0fa05b98b274f1477991c6a25313f38b1b2 to ArunJan 4a41a0f HEAD@{4}: checkout: moving from ArunJan to 4a41a0fa05b98b274f1477991c6a25313f38b1b2
2cae310 (HEAD -> ArunJan, origin/ArunJan) HEAD@{5}: reset: moving to 2cae31078cdf1c8abac9068330b2ccdd3fc424e3
f830534 HEAD@{6}: pull origin ArunJan: Merge made by the 'ort' strategy.
a590c01 HEAD@{7}: commit: projet creation task
4a41a0f HEAD@{8}: commit: create new project
b6cb3c5 HEAD@{9}: checkout: moving from b6cb3c5e82aea4c64ab2a1f0c37e53695d21f194 to ArunJan
b6cb3c5 HEAD@{10}: checkout: moving from dev-server to b6cb3c5e82aea4c64ab2a1f0c37e53695d21f194
5eeaf3c (dev-server) HEAD@{11}: revert: Revert "project created and copy URL"

Select the version you want to revert to. For example, if I wanted to revert to ‘project creation task’, I’d select the ID b0168ee. Next, run the following command to revert your repository to that version:

git reset --hard a590c01

Ballad answered 17/1, 2023 at 14:8 Comment(0)
E
0

if you have just pulled a branch on your local and want to remove changes caused by 'git pull' or 'git merge' command from your local workspace, then simply do a git reset --hard

this command will remove all of your uncommitted changes from the local workspace and can't be undone. So make sure to backup your important work that has not been committed yet.

Efrem answered 24/1, 2023 at 11:33 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.