6

我已经将一个 dev 分支(具有恒定的,有时是不稳定的更改)合并到我们的 master 分支(我们存储已发布的稳定代码的地方)。我想将 master 分支恢复到之前的状态,就像从未发生与 dev 分支的合并一样(并且当将来我们合并 dev 分支时,我们现在将丢弃的所有更改都将“再次”合并)。

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

master 分支的状态

我试过了:

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

经过一番研究,我认为更好的选择是做 agit reset --hard professional-1.1.2git push --force作为Git 的答案:如何忽略快进并将原点 [分支] 恢复到较早的提交?恢复推送的 git commit。其他开发人员在同一个办公室,他们永远不应该向 master 提交任何东西(我也不应该,但是......是的,我们没有每个分支的权限),所以告诉他们并做任何事情都不是什么大问题需要采取的行动。

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

4

3 回答 3

6

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

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

于 2012-04-26T09:54:30.333 回答
6

如果您只想使状态与master完全一样professional-1.1.2,同时避免重写历史和强制推送,您可以在 master 之上创建一个新的提交,代表项目的相同状态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)。

于 2012-04-26T10:08:45.180 回答
2

如果你是一个冒失鬼(对于所有其他提交者来说,从上游 rebase 中恢复可能是必要的)

git checkout yourbranch
git reset HEAD <commit-hash>
git push origin yourbranch -f
于 2012-04-27T09:47:10.627 回答