我开始处理主分支。差不多一年前,我创建了另一个分支 dev ,其中我做了一些更改。从那时起,我继续在dev分支上工作。现在我想将dev合并到master中导致很多冲突。我想通过覆盖master分支的内容将dev合并到master中,即出现任何冲突,我想保留dev分支的代码版本。怎么办呢?
答案 0 :(得分:5)
您将要使用“使用他们的合并”策略,该策略使用-X标志设置
git checkout master
git merge -X theirs dev
答案 1 :(得分:5)
您可以使用-X
开关指定the strategy option:
git checkout master
git merge -X theirs dev
有点解释。 -X theirs
表示:如果策略不能解决冲突,请使用递归策略进行合并,但回退到他们的更改。
这与-s ours
(由于某种原因,没有-s theirs
)不同,这将是一个贪婪的我们总是解决冲突的方法。
git-merge(1)
合并策略部分对此进行了更深入的解释。
答案 2 :(得分:2)
您可以使用所有提交强制推送到主控
git push -f origin master
答案 3 :(得分:1)
作为Paulo Bu noted,当您希望与"我们的"合并时,git为此提供了不同的方法。方法,但只有一个"开箱即用"当你想要与他们的"他们合并时#34;做法。值得举例说明两个:
$ git merge -s ours deadbranch # merge deadbranch and ignore all its code
或:
$ git merge -X ours livebranch # merge livebranch but use ours when conflicting
我还要注意,当你使用git merge
时,git首先找到" merge base&#34 ;,这两个分支最后同步的点:
o - X <-- master
/
o - o - B
\
o - Y <-- otherbranch
此处B
表示作为合并基础的提交,X
是您的分支的提示(master
),而Y
是另一个的提示科。 git将做的是差异B
vs X
和B
vs Y
。
让我们在&#34;我们的&#34;分支master
,我们有文件unchanged
,no-conflicts
,conflict
和removed
。这些名称与其他两个分支中发生的事情有关。
文件unchanged
在待合并分支中保持不变(即,从B
到Y
的差异根本不显示文件unchanged
)。 git merge
永远不会接触它,所以无论我们向git merge
提出什么论点,都不会改变。
其他文件在master
和/或其他分支中有一些更改。
文件no-conflicts
在顶部的master
中有一处更改,而在底部的另一个分支中有一处更改。这两个变化不冲突。 git merge -s recursive
将结合更改,无论您是否使用-X ours
选项。但是,git merge -s ours
会丢弃他们的更改,保留我们的文件版本no-conflicts
。对于这个的情况,结果是不同的。
文件conflict
在主文件顶部有一个更改,另一个分支在顶部也有不同的更改。 (变化可能在任何地方,它们只需重叠。&#34;在顶部&#34;使其重叠。)这意味着这些变化发生冲突。使用git merge -s recursive
,您将收到投诉,并且必须解决冲突。添加-X ours
,git会接受您的更改,丢掉他们的更改。使用git merge -s ours
,git会接受您的更改并丢弃他们的更改 - 因此对于此情况,结果是相同的。
文件removed
在master
中没有变化,但在其他分支中被删除。在这种情况下,git merge -s recursive
将删除该文件,无论您是否使用-X ours
。但是,git merge -s ours
会忽略删除。
简而言之,-s ours
和-s recursive -X ours
之间的区别在于前者,git 完全忽略了从B
到Y
的差异 ;对于后者,git尝试将差异B
- 到 - X
(我们的)和B
- 组合到 - Y
(他们的),但是对于在合并期间发生冲突,它会选择B
- 到 - X
更改。
使用-X theirs
(实际上是-s recursive -X theirs
),git会尝试合并差异,如果发生冲突,请选择B
- 到 - Y
更改超过B
- 至 - X
更改。
即使git没有内置此功能,也可以达到-s theirs
的效果。为此,请使用git merge --no-commit otherbranch
,然后从顶层使用git rm -rf .
删除产生合并(有或没有冲突),然后从顶层git checkout otherbranch -- .
根据otherbranch
重新填充树和索引。然后只需git commit
结果。但是,这很难得到这个,这就是为什么git不会将它作为内置策略。