Need to reset git branch to origin version
I was accidentally working on a branch I shouldn't have been for a while, so I branched off of it giving it the appropriate name. Now I want to overwrite the branch I shouldn't have been on to the version from origin (github). Is there an easy way to do this? I tried deleting the branch and then resetting up the tracking branch, but it just gives me the version I was working on again.
If you don't have pushed yet to origin, you can reset your branch to the upstream branch with:
git checkout mybranch
git reset --hard origin/mybranch
(Make sure that you reference your latest commit in a separate branch, like you mention in your question)
Note that, just after the reset, mybranch@{1}
refers to the old commit, before reset.
But if you had already pushed, see "Create git branch, and revert original to upstream state" for other options.
As commented by Brad Herman, a reset --hard
would remove any new file or reset modified file to HEAD .
Actually, to be sure you start from a "clean slate", a git clean -f -d
after the reset would ensure a working tree exactly identical to the branch you just reset to.
This blog post suggests those aliases (for master
branch only, but you can adapt/extend those):
[alias]
resetorigin = !git fetch origin && git reset --hard origin/master && git clean -f -d
resetupstream = !git fetch upstream && git reset --hard upstream/master && git clean -f -d
Then you can type:
git resetupstream
or
git resetorigin
Assuming this is what happened:
# on branch master
vi buggy.py # you edit file
git add buggy.py # stage file
git commit -m "Fix the bug" # commit
vi tests.py # edit another file but do not commit yet
Then you realise you make changes on the wrong branch.
git checkout -b mybranch # you create the correct branch and switch to it
But master
still points to your commit. You want it to point where it pointed before.
Solution
The easiest way is:
git branch --force master origin/master
Another way is:
git checkout master
git reset --soft origin/master
git checkout mybranch
Note that using reset --hard
will cause your uncommitted changes to be lost ( tests.py
in my example).
I have a private repo on a server and regularly rebase/force-push to it, which makes it necessary to reset the local branch on my other computer often. I therefore created the following alias "catchup", which allows doing this for the current branch. Unlike the other answer there is no hardcoded branch name in this alias.
Hold on tight.
[alias]
catchup = "!f(){ echo -n "reset 33[0;33m$(git symbolic-ref -q --short HEAD) 33[0m to 33[0;33m$(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)) 33[0m? (Y/n) "; read -r ans; if [ "$ans" = "y" -o "$ans" = "Y" -o -z "$ans" ]; then git reset --hard $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)); else echo "catchup aborted"; fi }; f"
Properly formatted (won't work with the newlines in .gitconfig) it looks like this:
"
!f(){
echo -n "reset 33[0;33m$(git symbolic-ref -q --short HEAD) 33[0m to 33[0;33m$(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)) 33[0m? (Y/n) ";
read -r ans;
if [ "$ans" = "y" -o "$ans" = "Y" -o -z "$ans" ]; then
git reset --hard $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD));
else
echo "catchup aborted";
fi
}; f
"