【发布时间】:2018-11-29 22:08:03
【问题描述】:
我的团队正在使用类似 Gitflow 的工作流程,但最近从 develop 到 master 的发布合并是无意中作为壁球合并完成的。当时,我们没有发出任何警报,并认为下次我们会做对的,但后来我们不得不对该版本进行热修复。现在,我们需要将该修补程序重新合并到develop,这与master 不同。我们遇到了一些冲突,其中一些是合法的,但其中大部分是由于 git 认为 master 上的 squash-merge 提交代表它自己对更改的单独提交,而不是来自 develop 的合并而产生的噪音。
图表可能有助于说明问题:
A ---------- D -- G (master)
\
\- B -- C -- E -- F (develop)
在这种情况下,D 是 B 和 C 的 squash-merge 的结果(而不是我们通常所做的常规合并)。请注意,git diff C D 返回空 - 即它们的内容相同。
现在,我想将master 合并到develop;由于E、F 和G 之间的合法重叠,我预计会出现一些冲突(因此我不能简单地说“使用我们的”或“使用他们的”)。但我在B、C 和D 中的所有内容基本上都发生了冲突,大概是因为 git 将D (可以理解)视为它自己的提交,在master 上的一个单独的提交链中从 A 开始.
长话短说,我希望的是“相对于这两个相同的提交(C 和 D)合并”而不是“相对于 A 合并”。有点像rebase --onto,但我猜是为了合并。
FWIW,我知道我可以手动解决冲突;我只是好奇是否有一种方法可以跳过在创建 D 时执行 squash-merge 而不是常规合并而引入的所有垃圾冲突。
【问题讨论】:
-
只需 checkout master 和 git merge --ours C 来重新创建丢失的合并历史
-
@AndrewC 那也行;我试图避免在
master上创建不必要的提交,但这似乎是一种相当干净的方式。事实证明,我们确定我们可以在不更改develop的修补程序的情况下顺利进行,因此我们最终从develop执行git merge -s ours master并且一切都很好。仍然有兴趣看看是否有其他方法可以解决这个问题(比如你的)而不简单地放弃更改。
标签: git merge version-control git-merge