Resetting remote to a certain commit
Assuming that your branch is called master
both here and remotely, and that your remote is called origin
you could do:
git reset --hard <commit-hash>
git push -f origin master
However, you should avoid doing this if anyone else is working with your remote repository and has pulled your changes. In that case, it would be better to revert the commits that you don't want, then push as normal.
Update: you've explained below that other people have pulled the changes that you've pushed, so it's better to create a new commit that reverts all of those changes. There's a nice explanation of your options for doing this in this answer from Jakub Narębski. Which one is most convenient depends on how many commits you want to revert, and which method makes most sense to you.
Since from your question it's clear that you have already used git reset --hard
to reset your master
branch, you may need to start by using git reset --hard ORIG_HEAD
to move your branch back to where it was before. (As always with git reset --hard
, make sure that git status
is clean, that you're on the right branch and that you're aware of git reflog
as a tool to recover apparently lost commits.) You should also check that ORIG_HEAD
points to the right commit, with git show ORIG_HEAD
.
Troubleshooting:
If you get a message like "! [remote rejected] a60f7d85 -> master (pre-receive hook declined)"
then you have to allow branch history rewriting for the specific branch. In BitBucket for example it said "Rewriting branch history is not allowed". There is a checkbox named Allow rewriting branch history
which you have to check.
Using some other answers can result in unnecessary loss of local state. Local changes are not inherently required to change a remote. This method can still wreck your remote if you choose the wrong commit to go back to, but even then you can usually find the right commit and try again.
You must have the desired commit somewhere in your local repo that you want the remote to match.
- Do not do any resetting.
- Use
git log
to find the commit you want to the remote to be at. Usegit log -p
to see changes, orgit log --graph --all --oneline --decorate
to see a compact tree. - Copy the commit's hash, tag, or (if it's the tip) its branch name.
- Run a command like:
e.g.git push --force <remote> <commit-ish>:<the remote branch>
orgit push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master
git push --force staging v2.4.0b2:releases
If the forced push fails, it's likely disabled by the remote. This may be worked around by temporarily changing one or both of receive.denyNonFastForwards
and receive.denyDeletes
. If your remote is hosted on a service without shell access, it probably has settings you can change to allow forced pushes.
I use a convenient alias (git go
) for viewing history as in step 2, which can be added like so:
git config --global alias.go 'log --graph --all --decorate --oneline'
I solved problem like yours by this commands:
git reset --hard <commit-hash>
git push -f <remote> <local branch>:<remote branch>
On GitLab, you may have to set your branch to unprotected before doing this. You can do this in [repo] > Settings > Repository > Protected Branches. Then the method from Mark's answer works.
git reset --hard <commit-hash>
git push -f origin master