【问题标题】:Merging branches from the same trunk into one of the branches将同一树干的分支合并到其中一个分支中
【发布时间】:2016-04-20 02:09:08
【问题描述】:

下图显示了我们拥有的 (RGB) 和我们想要拥有的 (Purple)。

在不同的时间,我们从树干做了三个分支(特征 A 到 C)。我们已经更新(合并)了从主干到每个分支的更改。

我们可以将每个分支合并到trunk但是,我们希望将分支 B 和 C 合并到 A,并在分支 A 上继续开发。

这可能吗,因为分支 B 和 C 不是从 A 创建的,而是从 trunk 创建的?

【问题讨论】:

    标签: svn tortoisesvn branching-and-merging


    【解决方案1】:

    您需要使用 2-URL 合并,正如 svn help merge 中的文本所述:

    1. 这种形式称为“2-URL 合并”:

      svn merge SOURCE1[@REV1] SOURCE2[@REV2] [TARGET_WCPATH]

      仅当其他变体不使用时,才应使用此合并变体 适用于您的情况,因为此变体可能非常复杂 主人。

      指定了两个源 URL,标识同一棵树上的两棵树 分支或不同的分支。比较树木和 从 SOURCE1@REV1 到 SOURCE2@REV2 的差异应用于 TARGET_WCPATH 中目标分支的工作副本。目标 分支可能与一个或两个来源相同,或再次不同。 所涉及的三个分支可以完全不相关。

      [...]

      2-URL 合并示例:

      已在名为“foo”的单独分支上开发了两个功能, '酒吧'。此后很明显,“bar”应该与 'foo' 分支,以便在重新集成之前进一步开发。

      虽然两个特性分支都来自主干,但它们不是 直接相关——一个不是另一个的直接副本。一个 2-URL 合并是必要的。

    您说每个分支都已将 trunk 中的所有更改合并到其中,因此不需要为第一个源指定修订。

    首先对您的 A 分支进行干净的结帐。然后,将 B 合并到 A

    svn merge ^/trunk ^/branches/B
    

    这会将 Btrunk 之间的差异合并到您的工作副本中,即 A。验证并提交这些更改(您可以通过在上述命令中将 diff 替换为 merge 来预览合并):

    svn commit -m "Merging B to A"
    

    接下来,将C合并到A

    svn merge ^/trunk ^/branches/C
    

    这会将 Ctrunk 之间的差异合并到您的工作副本中,即 AB的变化。验证并提交这些更改,现在您的 A 分支将拥有所有 BC 的更改。


    为了验证这一点,我创建了一个简单的脚本(Windows 批处理文件)。首先设置一些路径常量:

    @ECHO OFF
    
    SET CWD=%~dp0
    SET REPO_NAME=repo
    SET REPO_PATH="%CWD%%REPO_NAME%"
    SET WC_NAME=wc
    SET WC_PATH="%CWD%%WC_NAME%"
    
    :: Create REPO URI (C:\path\to\repo -> file:///C:/path/to/repo, see http://stackoverflow.com/a/27817626/1698557)
    FOR /f "delims=" %%R IN (%REPO_PATH%) DO SET REPO_URL=%%~fR%
    SET REPO_URL=file:///%REPO_URL%
    SET REPO_URL=%REPO_URL:///\\=//%
    SET REPO_URL=%REPO_URL:\=/%
    SET REPO_URL="%REPO_URL%"
    
    :: Cleanup previous run
    RMDIR /S /Q %REPO_PATH%
    RMDIR /S /Q %WC_PATH%
    

    然后创建一个存储库和结帐主干:

    svnadmin create %REPO_PATH%
    svn mkdir %REPO_URL%/trunk -m "Creating trunk directory"
    svn mkdir %REPO_URL%/branches -m "Creating branches directory"
    
    :: Checkout trunk
    svn checkout %REPO_URL%/trunk %WC_PATH%
    

    在创建虚拟内容和分支之间交替,以便分支具有不同的内容:

    echo alpha > %WC_PATH%\alpha.txt
    svn add %WC_PATH%\alpha.txt
    svn commit %WC_PATH% -m "Creating alpha.txt in trunk"
    svn copy %REPO_URL%/trunk %REPO_URL%/branches/A -m "Creating branch A"
    
    echo beta > %WC_PATH%\beta.txt
    svn add %WC_PATH%\beta.txt
    svn commit %WC_PATH% -m "Creating beta.txt in trunk"
    svn copy %REPO_URL%/trunk %REPO_URL%/branches/B -m "Creating branch B"
    
    echo gamma > %WC_PATH%\gamma.txt
    svn add %WC_PATH%\gamma.txt
    svn commit %WC_PATH% -m "Creating gamma.txt in trunk"
    svn copy %REPO_URL%/trunk %REPO_URL%/branches/C -m "Creating branch C"
    
    echo delta > %WC_PATH%\delta.txt
    svn add %WC_PATH%\delta.txt
    svn commit %WC_PATH% -m "Creating delta.txt in trunk"
    

    现在通过从主干合并来同步分支:

    svn switch %REPO_URL%/branches/A %WC_PATH%
    svn merge %REPO_URL%/trunk %WC_PATH%
    svn commit %WC_PATH% -m "Synchronizing branch A with trunk"
    
    svn switch %REPO_URL%/branches/B %WC_PATH%
    svn merge %REPO_URL%/trunk %WC_PATH%
    svn commit %WC_PATH% -m "Synchronizing branch B with trunk"
    
    svn switch %REPO_URL%/branches/C %WC_PATH%
    svn merge %REPO_URL%/trunk %WC_PATH%
    svn commit %WC_PATH% -m "Synchronizing branch C with trunk"
    

    在分支 BC 中创建一些不同的内容,以便合并实际上会做一些事情:

    svn switch %REPO_URL%/branches/B %WC_PATH%
    echo epsilon > %WC_PATH%\epsilon.txt
    svn add %WC_PATH%\epsilon.txt
    svn commit %WC_PATH% -m "Creating epsilon.txt in B"
    
    svn switch %REPO_URL%/branches/C %WC_PATH%
    echo zeta > %WC_PATH%\zeta.txt
    svn add %WC_PATH%\zeta.txt
    svn commit %WC_PATH% -m "Creating zeta.txt in C"
    

    将我们的工作副本切换回分支A

    > svn switch %REPO_URL%/branches/A %WC_PATH%
    D    wc\zeta.txt
     U   wc
    Updated to revision 14.
    

    现在,我们准备好将 B 合并到 A 上:

    > svn merge %REPO_URL%/trunk %REPO_URL%/branches/B %WC_PATH%
    --- Merging differences between repository URLs into 'wc':
    A    wc\epsilon.txt
     G   wc
    --- Recording mergeinfo for merge between repository URLs into 'wc':
     G   wc
    Sending        wc
    Adding         wc\epsilon.txt
    
    > svn commit %WC_PATH% -m "Merged B to A"
    Committing transaction...
    Committed revision 15.
    
    > svn update %WC_PATH%
    Updating 'wc':
    At revision 15.
    

    所以现在 epsilon.txt 在我们的 A 分支中。现在让我们将 C 合并到 A 上:

    > svn merge %REPO_URL%/trunk %REPO_URL%/branches/C %WC_PATH%
    --- Merging differences between repository URLs into 'wc':
    A    wc\zeta.txt
     G   wc
    --- Recording mergeinfo for merge between repository URLs into 'wc':
     G   wc
    Sending        wc
    Adding         wc\zeta.txt
    
    > svn commit %WC_PATH% -m "Merged C to A"
    Committing transaction...
    Committed revision 16.
    
    > svn update %WC_PATH%
    Updating 'wc':
    At revision 16.
    

    这将 zeta.txt 合并到 A 中,如果我们现在查看 A,我们可以验证:

    > svn ls %REPO_URL%/branches/A
    alpha.txt
    beta.txt
    delta.txt
    epsilon.txt
    gamma.txt
    zeta.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多