【问题标题】:How to avoid SVN conflicts when merging branch back into trunk将分支合并回主干时如何避免SVN冲突
【发布时间】:2010-11-19 03:42:54
【问题描述】:

几周前,我开始对我认为很小的 SVN 存储库的主干进行更改。

经过几个小时的工作,意识到更改的影响比我想象的要大,我认为立即将更改检查到主干太冒险,所以我做了一个分支,如下所示:

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

... 然后做了一个 svn 切换并愉快地继续在那个分支中工作。到目前为止,一切都很好,直到我对所有更改感到满意并想再次将它们合并回主干。因此,我将所有更改签入到 my-branch 中,然后仔细按照here 所示的程序进行操作……这就是我遇到麻烦的地方。因为我从本地(客户端)存储库中创建了我的分支,其中已经有大量(未签入)更改,所以合并不包括与这些更改对应的差异,因此存在合并中有很多很多冲突,我必须手动解决——这是我不想做的事情,因为如果我把它搞砸了,它会给错误留下空间。

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

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

...但这不起作用,因为 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 主干 HEAD,然后将 my-branch 检出到单独的目录中,然后手动将我的本地(未签入)更改从主干目录复制到 my-branch 目录,然后直接恢复本地主干......但这也很乏味且容易出错。

肯定有更好、更自动化的方法来创建包含本地(未签入)更改的分支,然后将其合并回主干?

【问题讨论】:

    标签: svn merge branch


    【解决方案1】:

    您的最后一个建议就快到了。当你想分支时,复制主干 HEAD。然后在你的工作副本中,

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

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

    【讨论】:

    • 酷,我没有意识到 svn switch 会保留我的本地编辑。这就是我缺少的东西:^)
    • 我的回答是在主干 HEAD 与新分支 HEAD 相同的假设下做出的。如果您在主干中有其他一些冲突的更改,我不保证它会成功保留您的本地编辑。
    【解决方案2】:

    好的,我想我已经知道如何干净利落地进行合并(有趣的是,编写问题通常可以澄清问题,不是吗?)。解决方案是进行两次合并,一次考虑主分支(原样)和 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
    

    【讨论】:

      猜你喜欢
      • 2014-11-27
      • 2010-11-03
      • 2012-08-28
      • 2011-04-16
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多