【问题标题】:git undo pushed merge to restore separate branchesgit undo push merge 恢复单独的分支
【发布时间】:2012-07-19 06:15:53
【问题描述】:

首先,我必须道歉 - 关于 SO 有很多“如何撤消合并”问题,但我对 git 太陌生了,我真的不明白如何使解决方案适应我的情况(尽管我确信他们可以)。

我有两个分支,versionAversionB。我在versionA 中进行了一些更改并将它们合并到versionB,这很好,因为versionA 中的更改是向前兼容的。然后,我想我一定是不小心将versionB 合并回versionA,这不好,因为versionB 向后兼容versionA

如何撤消此操作?

为了让事情更清楚,这就是我所做的:

versionA C--C--C--C'--M2
          \          /
           \        /
versionB C--M--C--C*

M: merged versionA into versionB. this is fine.
M2: accidentally merged versionB back into versionA

这就是我想要的:

versionA C--C--C--C'
          \         
           \       
versionB C--M--C--C*

如果我在 Mercurial 上,我会做 hg rollback 一切都会好起来的,或者我会 hg update C' 并在那里为 versionA 分支做出未来的提交,尽管这会使 M2 作为一个死悬垂的头(因此我更喜欢rollback 方法)。

versionA 分支清除最后一次提交M2 的git 方法是什么? (所有更改都已推送)。

【问题讨论】:

    标签: git merge branch


    【解决方案1】:

    你需要找到合并的提交。

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

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

    git revert -m 1 commit_hash

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

    另见:Which commit hash to undo a pushed merge using git-revert?

    【讨论】:

    • 谢谢!我可以要求进一步解释吗?第一个选项我的历史会是什么样子? M2 是一个悬空的头,进一步承诺versionA 全部脱落C'? (即我的versionA 的历史看起来像一条连续的线,上面挂着一片小(死)叶M2?)另外,你能解释一下git reset HEAD^ --hard 的作用吗?我看了一下git help reset,但它没有解释HEAD 之后的^ 的含义(尽管它在示例中使用了它)。我猜这意味着“HEAD之前的提交”?
    • 最后,如果我做第二个版本(清理历史),如果其他人已经将M2 拉入他们的历史会发生什么?同样,如果未来的人拉取存储库,他们会看到M2 吗?
    • 回答前几个问题 - 我在git help revisions 中找到了HEAD^ 的解释。基于git help revert,我认为我的新versionA 历史将是C--C--C--C'--M2--M2',其中M2' 表示“M2 的还原更改”。其他问题(reset HEAD^ --hard 是否会困扰已经签出M2 的任何人)仍然有效。
    • 您最好在任何人获取 repo 之前执行此操作,否则人们可能不喜欢您。我也刚刚意识到这是一个想要还原的合并,这有点复杂。我会编辑我的答案
    • 感谢您的更新-但不是合并M2 的提交吗? (或者你的意思是C'?)另外,你的命令根本不返回任何东西。
    猜你喜欢
    • 1970-01-01
    • 2015-03-11
    • 2013-08-04
    • 1970-01-01
    • 2021-12-27
    • 2011-03-14
    • 2019-04-11
    • 2019-09-30
    • 2018-08-30
    相关资源
    最近更新 更多