强制合并 Git

9

我想知道如何强制将dev分支合并到master分支?使用“git merge dev”会导致很多冲突。但是,我不想逐个解决它们。相反,我只想使用dev分支中的所有文件并将其合并到master分支。但是这种“强制合并”并不像我想象的那么容易。请问有人能指点我正确的方向吗?


1
“强制合并”是什么意思?你因为 Git 无法整理内容而遇到了冲突。你可以使用合并选项告诉 Git 在出现冲突时采用特定分支的版本: -Xours-Xtheirs - eftshift0
可以使用递归的“use -ours”策略。您可能只想更改主分支指向的内容。如果您共享此存储库,请小心操作。 - osowskit
@eftshift0 我偶然发现了这些选项。但老实说,我并不完全明白在我的情况下应该使用哪一个。我基本上希望我的开发分支成为我的“主分支”。这就是我所说的“强制合并”的意思。那么,“ours”分支和“theirs”分支分别是哪个分支? - Andi
1个回答

15

我只是想使用来自我的dev分支的所有文件。

如果你的意思是要使用来自你的dev分支的所有文件-即自从两个分支分叉以来在master分支上进行的任何更改都应该被撤销-那么有几种方法。

merge -s ours

你可以

git checkout dev
git merge -s ours master
git checkout master
git merge dev
这有点绕,因为没有“theirs”策略。(默认合并策略中有一个“theirs”策略选项,但只要不与dev的更改冲突,它仍会尝试应用来自master的更改;如果你想要的是仅保留dev版本,那行不通。)所以,你可以使用ours策略创建一个合并提交,其中包含所有文件的dev版本,然后将master快进到该合并。这意味着在合并提交上,父项的顺序将被颠倒,这通常是您不会注意到的,但在某些情况下可能很重要(例如,如果在日志或其他地方使用--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

1
“ours”和“theirs”对我来说总是很困惑...也许参考策略“recursive-ours”和“ours”的文档会有所帮助。 - Christoph
@Mark Adelsberger 感谢您的精彩写作。 "merge -s ours" 的方式对我很有帮助。 - Andi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接