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