首页 > 解决方案 > Git强制合并

问题描述

我想知道我应该怎么做才能强制从 dev 分支合并到我的 master 分支?使用“git merge dev”会导致很多冲突。但是,我不想单独处理它们。相反,我只想使用我的 dev 分支中的所有文件并将其合并到 master 中。但是这种“强制合并”并不像我想象的那么容易。有人可以指出我正确的方向吗?

标签: gitgithub

解决方案


我只是想使用我的 dev 分支中的所有文件

如果你的意思是你想使用你的 dev 分支中的所有文件 - 即,由于分支分歧而对分支所做的任何更改都master应该撤消 - 那么有几种方法。

合并 -s 我们的

你可以

git checkout dev
git merge -s ours master
git checkout master
git merge dev

这有点迂回,因为没有“他们的”策略。(默认合并策略有一个“他们的”策略选项,但它仍然会尝试应用更改,master只要它们与更改不冲突dev;如果你想要的只是保留dev版本,那不会' t 工作。)因此,您使用该策略在所有文件的版本之间ours创建合并提交,然后快进到该合并。masterdevdevmaster

这意味着在合并提交时父母的顺序将被颠倒,这是您通常不会注意到的,但在某些情况下它可能很重要(例如,如果您--first-parent在日志或其他东西上使用)。

提交树

如果父母的顺序很重要,您可以使用管道命令commit-tree

git checkout master
git merge $(git commit-tree dev -p master -p dev -m "merging dev over master")

历史改写

上述方法的潜在缺点是它们产生的合并提交可能不直观,因为它的结果忽略了合并一侧的更改(而合并预计会合并双方的更改)。因为您的合并在正常策略下会发生冲突,所以问题并不大,但仍然有人将其归类为“邪恶合并”。如果你想避免这种情况,另一个选择是重写历史。

这也有不利的一面,特别是如果您使用此存储库与其他开发人员协作。git rebase您可以在“从上游变基中恢复”下的文档中阅读有关该问题的信息(以及通常如何解决该问题) 。(虽然文档将问题称为“上游变基”,但它确实适用于共享分支的任何历史重写。)

如果您认为历史重写是有意义的,那么最简单的事情就是移动master分支,使其指向与dev.

git checkout dev
git branch -f master

推荐阅读