在git中撤消几个合并提交

时间:2015-02-12 16:55:00

标签: git git-merge

在撤消git merges时遇到一些问题。发生了什么:

  • 主题和beta均来自master,但主题的分支晚于beta。
  • 开发人员1(D1)对beta进行更改
  • 开发人员2(D2)创建主题分支,进行一些提交并将其合并到beta
  • 合并D2时会发生冲突,因为B和C在与D,E和F
  • 相同的文件中有变化
  • D2通过执行git checkout选择主题分支中的更改 - 他们& git add / commit
  • D2将他的更改推送到原点
  • D2进行另一次提交,合并它,然后另一次提交并合并它(没有问题)
  • D2也将这些更改推送到原点
  • D1运行git pull
  • D1抱怨他在测试版上所做的更改已被覆盖

        X---D---E---F---M1--M2--M3 beta
       /               /   /   /
      /       X---X---X---X---X topic
     /       /
    A---B---C---X---X master
    

我读了一些stackoverflow问题并在#git中询问并最终运行git revert -m 1 M3,git revert -m 1 M2和git revert -m 1 M1。 D1很高兴他的改变又回来了。

我现在认为我可以将主题合并到测试版但是这次选择git checkout --ours但我不能因为没有发生任何事情。我读过https://www.kernel.org/pub/software/scm/git/docs/howto/revert-a-faulty-merge.txt,但仍然不理解所有内容。

我最终将我的所有主题提交重新绑定到一个提交,然后我可以合并到beta。

我想知道的是,如果有更简单的方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

您无法再次在主题中合并的原因是因为更改已经存在于历史记录中,并且git没有任何内容可以引入分支。当您执行git revert撤消合并时,您创建了新的提交。这些提交与已经完成的合并提交相反。分支测试版具有从主题撤消的更改,但提交仍然在历史记录中,因此当您尝试再次合并时,没有任何内容可以合并。您通过创建一个新文件来“取消”提交,该文件将文件更改回原来的状态。

这就是你的分支现在的样子

    X---D---E---F---M1--M2--M3--R1--R2--R3 beta
   /               /   /   /
  /       X---X---X---X---X topic
 /       /
A---B---C---X---X master

R1,R2和R3是您拥有的合并的还原提交。

解决问题的更简单方法就是让D2正确解决合并冲突。来自D1的更改在他们检查文件并提交时被踩到了。

如果确实再次发生,解决问题的最佳方法是创建一个能够正确解决冲突的新提交。只要解决合并冲突的人没有使用-m选项提交,git就会附加在合并提交中有冲突的文件。然后您可以使用git log -p -m {MERGE SHA} {FILE},您可以看到文件中的更改并更正它们。

要从主题引入更改,您必须手动执行此操作。您可以通过git diff --name-only beta topic获取不同的文件列表。然后执行git checkout topic -- <files>然后提交文件,将文件自行测试。