将推送的分支恢复为具体提交

Car*_*rós 4 git git-revert git-reset

我已将dev分支(具有常量,有时不稳定的更改)合并到我们的主分支(我们存储已发布的稳定代码).我想将master分支恢复到之前的状态,就像从未发生与dev分支的合并一样(并且在将来我们合并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.
Run Code Online (Sandbox Code Playgroud)

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

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

Let*_*_Be 6

-m number选项指定要还原到哪个父项(因为合并具有多个父项).

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

  • @CarlosCampderrós您认为合并提交是什么?是的,这将恢复合并,这意味着:它将删除您合并到分支中的所有更改. (2认同)

Mar*_*air 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
Run Code Online (Sandbox Code Playgroud)

作为替代方案,你可以按照Charles Bailey这个答案中建议的步骤完成相同的事情,但是我认为(尽管我建议的步骤涉及"管道"命令git read-tree)稍微有些混乱.