Reputation: 34247
Myself and one other developer had been merging and pushing our work to a non-master branch called toolwork. That way, we didn't impact the rest of the team. My topic branch was called DPM-93 and my git workflow was this.
# do some work
git checkout DPM-93
git commit -m "did some work"
# catch up
git checkout toolwork
git pull origin toolwork
# rebase my topic branch
git checkout DPM-93
git rebase toolwork
# merge and push my changes
git checkout toolwork
git merge --no-ff DPM-93
git push origin toolwork
That was mostly working fine until I accidently issued these git commands
git checkout toolwork
git pull origin master
At that point, a bunch of new stuff showed up in branch toolwork and I'm not sure how to get rid of it short of deleting my workspace and re-cloning from the repo.
Is there any way to back this out to the state before the pull?
Upvotes: 89
Views: 57665
Reputation: 31
Step 1:
git log
git reset --hard <hash>,
The hash is something like 0928817nsbn78867hs3g5666
Example: if you git log
, you will get:
commit 0928817nsbn78867hs3g5666 (HEAD -> yourrepo, origin/yourrepo)
Step 2:
git reset --hard 0928817nsbn78867hs3g5666
Upvotes: 2
Reputation: 3508
You can abort that merge using below command
git merge --abort
It will simply undo the accidental pull...
Upvotes: 0
Reputation: 3713
What worked for me is simply
git reset --hard
I did this from the local repository with the unfortunate merge/pull:
Laptop@LAPTOP-xxxxxxxx /d/Google Drive/xxxxxxx/Github/xxxxx (staging_ec2|MERGING)
$ git reset --hard
HEAD is now at 2d5a511 [last commit comment]
Laptop@LAPTOP-xxxxxxxx /d/Google Drive/xxxxxxx/Github/xxxxx (staging_ec2)
$
Upvotes: 2
Reputation: 3562
I did a similar thing recently, and used a simpler solution based on this answer.
Assuming that the state of the toolwork
branch that you want to revert to has been pushed to origin
, you can simply do
git fetch origin
git reset --hard origin/toolwork
In my case, the value of ORIG_HEAD
had been overwritten by another merge on a different branch, and doing this I didn't have to worry about searching for the correct commit in the log.
Upvotes: 7
Reputation: 1323223
git reset --hard ORIG_HEAD
From the git reset
man page (if you just did the pull):
Undo a merge or pull
$ git pull (1)
Auto-merging nitfol
CONFLICT (content): Merge conflict in nitfol
Automatic merge failed; fix conflicts and then commit the result.
$ git reset --hard (2)
$ git pull . topic/branch (3)
Updating from 41223... to 13134...
Fast-forward
$ git reset --hard ORIG_HEAD (4)
- Try to update from the upstream resulted in a lot of conflicts; you were not ready to spend a lot of time merging right now, so you decide to do that later.
- "
pull
" has not made merge commit, so "git reset --hard
" which is a synonym for "git reset --hard HEAD
" clears the mess from the index file and the working tree.- Merge a topic branch into the current branch, which resulted in a fast-forward.
- But you decided that the topic branch is not ready for public consumption yet.
"pull" or "merge" always leaves the original tip of the current branch inORIG_HEAD
, so resetting hard to it brings your index file and the working tree back to that state, and resets the tip of the branch to that commit.
See HEAD
and ORIG_HEAD
for more.
Upvotes: 127
Reputation: 54276
You can use git log
to find the SHA-1 of the revision you want to be at the head of your toolwork
branch, then use git reset --hard <SHA1>
to revert your working copy to that revision.
Back everything up first! And re-read the man page for git reset
to make sure it's doing what you want.
EDIT: Oh yes, ORIG_HEAD should contain the right SHA-1. But check first.
Upvotes: 11