【问题标题】:Git merge finds conflict after reverting to common version between branchesGit合并在分支之间恢复为通用版本后发现冲突
【发布时间】:2019-01-25 01:08:56
【问题描述】:

我有两个分支,分别称为 testprod-candidate。这两个分支在它们的历史中有一个共同的提交,a0e378cfe28,它最初是在测试分支中,后来被合并到 prod-candidate 中。在这次提交之后,这两个分支采用了不同的方式,并有其他相关的提交。

现在是时候再次将 test 合并到 prod-candidate 中了,所以我希望通过将 prod-candidate 分支中的所有提交恢复为提交 a0e378cfe28 我能够毫无问题地进行合并。我进行了还原,通过运行 git diff 我能够验证还原是否成功,因为 prod-candidate 分支与提交 a0e378cfe28 具有完全相同的内容。

不幸的是,在检查 prod-candidate 并运行 git merge test 后,我在 POM 文件中遇到了冲突,我不明白为什么。测试分支有一个版本为18.4.0-101 的POM 和prod-candidate,在revert 之前版本为18.3.0-204,当前版本为18.3.0-101(与提交a0e378cfe28 相同)。

为什么我不能在恢复到公共基础提交后合并分支?

【问题讨论】:

  • “我希望通过将 prod-candidate 分支中的所有提交还原为提交 a0e378cfe28”是什么意思?你具体执行了什么命令?
  • 请注意,“完全相同的内容”并不意味着到达那里的历史是相同的。变更历史对于 git 来说比所有变更累积的最终结果更重要。
  • @Code-Apprentice 我将 prod-candidate 分支中的每个提交都还原到 a0e378cfe28。这样,prod-candidate 分支就处于 test 分支曾经的状态,因此我希望能够将 test 合并到其中。

标签: git merge git-merge git-revert


【解决方案1】:

听起来你这样做很困难。如果您希望prod-candidate 分支包含与test 分支相同的更改,最简单的方法是这样做:

git checkout prod-candidate
git reset --hard test

这将有效地移动prod-candidate 指向与test 相同的提交。这意味着它将具有完全相同的修订历史。您也不必担心任何合并冲突。

注意

git revert 将创建一个新的提交来反转指定提交的更改。如果您一次还原多个提交,则最终结果是一串提交,它会撤消先前提交中的更改。即使您最终在两个分支上获得相同的内容,它们也有两个不同的历史。您会遇到合并冲突,因为在两个分支上以不同的方式更改了一条线。 Git 未检测到 prod-candidate 中的代码行已更改回与共享父提交相同的内容。

【讨论】:

  • 不幸的是,硬重置不是一个选项,因为回购中不允许非 FF 推送。至于多次提交,我实际上是在使用--no-commit 进行还原,我对结果非常满意。我想“一条线在两个分支上以不同的方式更改”是迄今为止我遇到的问题的最佳解释。一种解决方法是将-X theirs 添加到合并中,这将强制在test 而不是prod-candidate 一侧解决冲突。
  • @Phil 是的,由于限制,您将不得不处理合并冲突。听起来你有一个很好的方法来做到这一点。
  • 我接受了您的回答,但您能否在下面添加-X theirs 选项,以防不允许强制推送?我认为许多存储库都配置了该选项...只是为了使答案更完整。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
相关资源
最近更新 更多