【问题标题】:Which commit hash to undo a pushed merge using git-revert?哪个提交哈希使用 git-revert 撤消推送的合并?
【发布时间】:2012-07-18 18:51:12
【问题描述】:

我将 beta 分支合并到 master 分支。我推到原点。我现在希望 master 在本地和远程都像合并之前一样。

undoing a merge that was already pushed 的好答案建议

git revert -m 1 commit_hash

如果这确实是要走的路,我如何确定 commit_hash?我尝试了merge-base返回的哈希失败:

$ git merge-base --all master beta
1f4b949b7ef97abf913ae672e3acd0907abfac1b
$ git revert -m 1 1f4b949b7ef97abf913ae672e3acd0907abfac1b
error: Mainline was specified but commit 1f4b949b7ef97abf913ae672e3acd0907abfac1b is not a merge.
fatal: revert failed

我已经检查了分支的 git-log 和 gitk 演绎版,但是它们很长,而且我对自己的解释不确定,觉得我应该在弄得更大的混乱之前寻求帮助。 Beta 源自 v2,v2 源自 master。在此过程中,随着我使新分支与 master 保持同步,从 master 到 v2 和 beta 进行了一些合并。从 beta 到 master 方向的合并是一个我希望纠正的错误。

一旦我确定了合并点,如果我发现合并后在 master 上所做的任何提交确实应该在 beta 分支上,那么将它们移过来的最佳方法是什么?

【问题讨论】:

  • 试试log --all --graph --pretty=tformat:'%Cred%h%Creset -%C(yellow)%d%Creset%s %Cgreen(%an %cr)%Creset' --abbrev-commit --date=relative(我个人给它起了别名),它将显示所有分支的提交及其日期,以及合并发生在哪里。

标签: git undo git-merge git-log git-revert


【解决方案1】:

您需要找到合并的提交,git merge-base 告诉您可以在哪里进行合并的提交。它基本上是这两个分支中存在的最后一次提交。合并提交仅存在于您的主分支中,除非您在合并后创建了一个新分支,但这与此处无关。 :)

要查找合并提交,请尝试: git log master ^beta --ancestry-path --merges

所需的提交是最后一次提交。

但是请阅读 Linus 的文章:http://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.txt

【讨论】:

    【解决方案2】:

    还可以查看http://sethrobertson.github.com/GitFixUm/,它可以引导您解决几乎所有 git 问题,包括推送合并。但是...推送合并没有简单的解决方案。

    【讨论】:

      猜你喜欢
      • 2014-05-06
      • 2022-05-31
      • 2020-06-30
      • 2011-08-22
      • 2011-01-24
      相关资源
      最近更新 更多