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

我已经将一个开发分支(具有常量,有时不稳定的更改)合并到我们的主分支(我们存储已发布的稳定代码的地方)。 我想将master分支恢复到之前的状态,比如与dev分支的合并从未发生过(并且在将来我们合并开发分支时,我们现在将放弃的所有更改将再次合并)。

这是主分支的当前状态,我希望它在HEAD处具有'professional-1.1.2'提交/标记。

主分支的状态

我试过了:

$ 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.

经过一番研究,我认为更好的选择是做一个git reset --hard professional-1.1.2git push --force作为Git的答案:如何忽略快进并将原点[分支]恢复到之前的提交? 或者恢复push'd git commit。 其他开发人员在同一个办公室,他们不应该承诺任何东西来掌握(因为我不应该,但是...是的,我们没有每个分支的权限),所以这不是一个大问题告诉他们,做任何事情需要采取的行动。

所以最后问题是: git revert something或者git reset --hard <TAG> && git push --force ? 如果git revert ,我应该使用哪个命令行?


-m number选项指定您想要恢复到哪个父母(因为合并有多个父母)。

所以你想要git revert -m 1 HEAD或者git revert -m 1 SHA_OF_MERGE_COMMIT (假设你做了git checkout master; git merge devel;


如果你只想让master的状态与professional-1.1.2完全一致,同时避免重写历史记录和强制推送,那么你可以在master之上创建一个新的提交,代表与professional-1.1.2相同的项目状态professional-1.1.2 。 你可以通过以下步骤来做到这一点:

# 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

作为一种替代方法,您可以按照Charles Bailey的答案中提出的步骤完成相同的事情,但会稍微混淆一点,我认为(即使我提出的步骤涉及“管道”命令git read-tree )。


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

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

上一篇: Revert pushed branch to a concrete commit

下一篇: How to use Git Revert