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 ?
git reset --hard 01b34fa
, in this case you could have done git reset --hard HEAD^
which resets to one commit before the HEAD.
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.
Running git pull
performs the following tasks, in order:
git fetch 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"}
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.
git reset HEAD --hard
, for instance?
git reset --hard HEAD@{n}
worked
git reflog
: dab04ec HEAD@{0}, aaaaaaa HEAD@{1} and bbbbbbb HEAD@{2}. If I do git reset --hard bbbbbbb
I will lost the HEAD 0 and 1 ?
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.
git merge --abort
works DURING a merge, not after git pull
is finished. So this answer seems irrelevant to the question.
git reset --merge
deletes all changes not staged for commit. Found this out the hard way.
fatal: There is no merge to abort (MERGE_HEAD missing)
Does not work even during a (unsuccessful) merge
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}
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
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}
Updating ffce65bd..e929e884
, the do git reset --hard ffce65bd
you can do git reset --hard ORIG_HEAD
since "pull" or "merge" set ORIG_HEAD to be the current state before doing those actions.
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.
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).
Try run
git reset --keep HEAD@{1}
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.
Success story sharing
master@{1}
, which is the previous position ofmaster
,master@{"5 minutes ago"}
, ormaster@{14:30}
. Full details on specifying revisions in this way can be found inman git-rev-parse
, in the section called "specifying revisions".Updating d2c90a3..035ac4d
. Here, you can also used2c90a3
as a parameter to reset.