Revert pushed branch to a concrete commit

I have merged a dev branch (with constant, sometimes unstable changes) to our master branch (where we store the released, stable code). I want to restore the master branch to the state it was before like the merge with the dev branch had never happened (and that when in the future we merge the dev branch all changes that we will discard now will be merged "again").

This is the current status of the master branch and I want it to have the 'professional-1.1.2' commit/tag at the HEAD.

主分支的状态

I tried:

$ git revert -n professional-1.1.2..HEAD
fatal: Commit 9167e846a387c793edbc089c7ab6bd9eb8260456 is a merge but no -m option was given.
$ git revert -n -m 1 professional-1.1.2..HEAD
fatal: Mainline was specified but commit 380169097f35d07466640bc0db1b639278cd25fa is not a merge.
$ git revert -n -m 2 professional-1.1.2..HEAD
fatal: Mainline was specified but commit 380169097f35d07466640bc0db1b639278cd25fa is not a merge.

After a bit of research I think that the better option is do a git reset --hard professional-1.1.2 and git push --force as the answer to Git: How to ignore fast forward and revert origin [branch] to earlier commit? or reverting push'd git commit . Other developers are in the same office, and they should never commit anything to master (as neither should I, but... yeah, we don't have permissions per branch), so it's not a big problem to tell them and do any action required.

So in the end the question is: git revert something or git reset --hard <TAG> && git push --force ? If git revert , which commandline should I use?


The -m number option specifies which of the parents you want to revert to (since a merge has multiple parents).

So you want git revert -m 1 HEAD or git revert -m 1 SHA_OF_MERGE_COMMIT (assuming you did git checkout master; git merge devel; )


If you just want to make the state of master exactly the same as professional-1.1.2 , while avoiding rewriting history and force-pushing, you can just create a new commit on top of master that represents the same state of the project as professional-1.1.2 . You can do that with the following steps:

# Check that "git status" is clean, since the steps that follow will throw
# way uncommitted changes:
git status

# Set the index (staging area) to be as it was at professional-1.1.2:
git read-tree professional-1.1.2

# Create a commit based on that index:
git commit -m "Reverting to the state at professional-1.1.2"

# Your working tree will still be as it was when you started, so
# you'll want to reset that to the new commit:
git reset --hard

As an alternative, you can follow the steps suggested in this answer by Charles Bailey, which accomplishes the same thing, but is slightly more confusing, I think (even though the steps I've suggested involve the "plumbing" command git read-tree ).


如果你是一个冒失鬼(从上游重新开始恢复可能是所有其他提交者必需的)

git checkout yourbranch
git reset HEAD <commit-hash>
git push origin yourbranch -f
链接地址: http://www.djcxy.com/p/18832.html

上一篇: Git更改分支,但不要更改工作区中的文件

下一篇: 恢复推送分支到一个具体的提交