将分支合并回主干时如何避免SVN冲突

时间:2009-08-13 00:01:33

标签: svn merge branch

几个星期前,我开始在SVN存储库的主干中进行更改,我认为这个更改很小。

经过几个小时的工作,我意识到变化的影响比我想象的要大,我觉得立刻检查我的变化是否太冒险了,所以我做了一个分支,就像这样:

svn copy . https://my_svn_server/svn/blah/branches/my-branch

...然后做了一个svn开关,并愉快地继续在那个分支工作。到目前为止,这么好,直到我对所有变化感到高兴,并希望将它们再次合并回主干。所以我将所有更改都检入my-branch,然后仔细按照here所示的步骤进行操作......这就是我遇到麻烦的地方。因为我从本地(客户端)存储库创建了my-branch,该存储库已经有大量(未签入的)未完成的更改,所以合并不包括与这些更改对应的差异,因此存在合并中有很多很多冲突,我必须手工解决 - 这是我不想做的事情,因为如果我搞砸它就会留下虫子进入的空间。

我尝试通过减少合并期间指定的修订号来包括缺失的差异,例如做一个

svn merge -r2818:2932 https://my_svn_server/svn/blah/branches/my-branch

而不是预期的

svn merge -r2819:2932 https://my_svn_server/svn/blah/branches/my-branch

...但是这没有用,因为我的分支在修订版2818中不存在,所以我只是得到一个错误:

svn: Unable to find repository location for 'https://my_svn_server/svn/blah/branches/my-branch' in revision 2818

这就是事情的立场。这次我可以手动理清这个烂摊子,但我很好奇是否有办法处理这个问题,以便下次事情变得更好。

我能想到的一种方法是创建my-branch而不是复制本地(客户端)存储库,而是复制SVN trunk HEAD,然后将my-branch签出到一个单独的目录中,然后手动将我的本地(未签入)更改从trunk目录复制到my-branch目录,然后直接还原本地中继...但这也非常繁琐且容易出错。

当然有一种更好,更自动的方法来制作包含本地(未签入)更改的分支,然后将其合并回主干?

2 个答案:

答案 0 :(得分:7)

你的最后一个建议几乎就在那里。如果要分支,请复制主干HEAD。然后在你的工作副本中,

svn switch https://my_svn_server/svn/blah/branches/my-branch

这将切换到分支,同时保留所有本地修改。然后,您可以随时将更改提交到分支。

答案 1 :(得分:1)

好吧,我想我已经弄清楚如何干净利落地进行合并(有趣的是如何撰写一个问题经常澄清问题,不是吗?)。解决方案是进行两次合并,一次是为了解释主分支(原样)和my-branch的开头之间的差异,然后是第二次合并以考虑my-branch中的后续更改:

svn merge https://my_svn_server/svn/blah/trunk/software@2818 https://my_svn_server/svnblah/branches/my-branch@2819
svn merge -r2819:2932 https://my_svn_server/svn/blah/branches/my-branch