git如何通过完全覆盖主分支将分支合并到主分支

时间:2014-07-23 21:15:57

标签: git git-branch

我开始处理分支。差不多一年前,我创建了另一个分支 dev ,其中我做了一些更改。从那时起,我继续在dev分支上工作。现在我想将dev合并到master中导致很多冲突。我想通过覆盖master分支的内容将dev合并到master中,即出现任何冲突,我想保留dev分支的代码版本。怎么办呢?

4 个答案:

答案 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 XB vs Y

让我们在&#34;我们的&#34;分支master,我们有文件unchangedno-conflictsconflictremoved。这些名称与其他两个分支中发生的事情有关。

文件unchanged在待合并分支中保持不变(即,从BY的差异根本不显示文件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会接受您的更改并丢弃他们的更改 - 因此对于情况,结果是相同的。

文件removedmaster中没有变化,但在其他分支中被删除。在这种情况下,git merge -s recursive将删除该文件,无论您是否使用-X ours。但是,git merge -s ours会忽略删除。

简而言之,-s ours-s recursive -X ours之间的区别在于前者,git 完全忽略了从BY的差异 ;对于后者,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不会将它作为内置策略。