在您的示例中,有人正在合并 f36908d(第一个父项;合并时的 HEAD)和 8def6e9(第二个父项;可能是合并时源分支的尖端)以生成 326c8fd0。
如果合并提交 (326c8fd0) 缺少与其父项中的任何一个相关的重要内容(f36908d 和 8def6e9;您说它缺少后者的部分),那么创建合并提交的人可能正在以不适当的方式执行合并时尚。
此人可能正在使用ours
合并策略(使用-s ours
/合并或拉取--strategy=ours
)、ours
默认递归合并策略的选项(使用-X ours
/合并或拉取--strategy-option=ours
),或者他们可能只是在手动解决合并冲突时做出了错误的决定。
该ours
策略完全忽略了除第一个之外的所有父母在历史上所做的任何内容更改。您通常可以识别这种类型的合并,因为合并提交及其第一个父级(即它们的更改)将具有相同的树(即git diff f36908d 326c8fd0
不会显示任何差异)。
合并ours
策略选项也将忽略来自第二个父级历史的更改(即您的更改),但只会忽略那些与第一个父级历史中所做的更改相冲突的更改(即他们的更改)。在这种情况下,来自第二个父项的某些更改可能会进入结果,但其他更改可能会完全删除。
另一种可能的选择是,他们只是在解决默认合并期间产生的冲突时做出了错误的决定。
无论哪种方式,有人可能必须与进行合并的用户交谈,以了解他们究竟做了什么,以及他们为什么这样做,以便制定政策来防止将来出现问题。
要恢复,您可以自己重做合并,然后他们将结果合并到历史的当前提示中:
git checkout -b remerge f36908d
git merge 8def6e9
# resolve conflicts and commit
git checkout develop
git merge remerge
# maybe resolve more conflicts
# eventually: git branch -d remerge
或者,如果您可以重写历史记录:
git checkout -b remerge f36908d
git merge 8def6e9
# resolve conflicts and commit
git rebase --onto remerge 326c8fd0 develop
# maybe more conflicts to resolve at each rebased commit