2014-07-23 116 views
6

我开始工作主分支分支。大约一年前,我创建了另一个分支dev,其中我做了一些修改。从那时起,我继续在开发分支上工作。现在我想将开发合并到主导致很多冲突。我想通过覆盖主分支的内容来将开发者合并到主控中,即对于出现的任何冲突,我想保留开发者分支的代码版本。如何做呢 ?git如何通过完全覆盖主分支将分支合并到主分支

回答

5

你要使用的策略,这是使用-X标志

git checkout master 
git merge -X theirs dev 
5

树立了“用他们的合并”你可以用-X开关指定the strategy option

git checkout master 
git merge -X theirs dev 

有点说明。 -X theirs的意思是:使用递归策略与合并但回退到更改如果策略不能解决冲突。

这是-s ours不同(因为某些原因没有-s theirs),这将是一个贪婪的拿我们总是解决冲突。

git-merge(1)合并策略部分对此提供了更深入的解释。

+0

什么是-X在这里? –

+0

@hrehman策略选项。添加了一个链接供进一步参考。 –

+0

在这里要小心,'-X我们'或'-X他们'与''我们''是完全不同的。没有“他们”。这听起来像'-X他们'是OP想要的,所以我相信这是正确的答案(并提高了它)。 – torek

2

可以强制推到主与所有你提交

git push -f origin master 
1

由于Paulo Bu noted,GIT中提供了这种不同的方法,当你想用“我们”的方式合并,但只有一个“出来的盒子“,当你想要一个”他们“的方法合并。值得说明两个举例:

$ 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会先找到“合并基地”,在该点两个分支机构上次同步:

  o - X <-- master 
     /
o - o - B 
      \ 
      o - Y <-- otherbranch 

这里B代表提交那就是合并基础,X是你分支的末端(master)和Y是另一个分支的提示。 git会做的是diff B vs XB vs Y

比方说,在 “我们的” 分支,master,我们有文件unchangedno-conflicts,和removed。这些名字是关于其他两个分支发生的事情。

文件unchanged是不变的待合并分支(即,DIFF从BY显示什么都没有文件unchanged)。 git merge永远不会触及它,所以无论我们给git merge的参数如何,都不会改变。

其他文件在master和/或其他分支中有一些变化。

文件no-conflictsmaster的顶部有一处变化,在底部的另一处有一处变化。这两个变化不冲突。 git merge -s recursive将结合更改,无论您是否使用-X ours选项。然而,git merge -s ours将放弃其更改,保留我们的文件版本no-conflicts。对于这个的情况,结果是不同的。

文件在主文件的顶部有一个变化,另一个分支的变化也在顶部。 (这些变化可能在任何地方,它们只是必须重叠。“在顶部”使它重叠。)这意味着这些变化是冲突的。使用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 完全忽略DIFF从BY;对于后者,git会尝试组合差异B - 至 - X(我们)和B - 至 - Y(他们的),但是在组合期间发生冲突时,它会选择BX更改。

随着-X theirs(这是真的-s recursive -X theirs),混帐尝试制作diff结合起来,并在发生冲突的情况下,选择在B至 - X变化B至 - Y变化。


这是可能实现的-s theirs即使混帐没有这个建在等价的。要做到这一点,使用git merge --no-commit otherbranch,然后git rm -rf .从顶层除去最后的合并结果(有或无冲突) ,然后从顶层git checkout otherbranch -- .根据otherbranch重新填充树和索引。然后简单地git commit的结果。然而,这是非常罕见的,这就是为什么git没有将其作为内置策略。

相关问题