如何将分支合并回主分支并避免树冲突 - TortoiseSVN

0 svn version-control tortoisesvn svn-merge svn-reintegrate

我使用TortoiseSVN在SVN中管理源文件.我添加了文件并将它们提交给修订版,随后决定分支.我用我需要的文件分支,并在不打算使用的文件的主干上执行删除.

现在我试图将分支重新集成到主干线.使用乌龟,我已经从主干到分支合并了从后备箱到头部的删除后的修改范围.这使分支机构更新.

现在我切换到主干,并尝试将修订从分支合并到主干,合并表示新文件被"跳过"或删除我现在完成的文件.

我是否遗漏了合并成为最新的行李箱?

Dav*_* W. 6

Subversion合并需要一些东西:

共同的祖先

你认为这不是一件容易的事,但这种情况发生了很多.我见过开发人员会创建一个分支使用svn mkdir,检查该分支,将文件从主干复制到该分支,然后再做一个svn add将它们添加回去.

虽然分支和主干具有相同的名称和相同的结构,但Subversion将它们视为两个完全独立的文件.主干和该分支之间没有共同的历史.当然,开发人员应该习惯svn cp将trunk复制到分支.

但是,您可以在较小的块中遇到类似的问题.想象一下,开发人员以正确的方式创建分支.然后发现*.jpg项目中缺少某些文件.开发人员检出分支,并添加文件.一切都照顾好了.现在,开发人员意识到同样的bug也在trunk上.没问题,checkout trunk添加添加丢失的*.jpg文件.

当然,*.jpgtrunk上的文件与分支上​​的文件不共享共同的祖先.开发人员应该*.jpgs将从分支创建的修订版合并到主干.

修订冲突

Subversion不合并分支:它合并更改.这是一个难以理解的概念,但它为Subversion提供了很多合并能力.

我有一个我在版本100上创建的分支.

分支的修订历史

  • 100:创建分支
  • 103:Bugfix 2001
  • 110:合并后备箱到分支
  • 112:做出更多改变

树干的修订历史

  • 102:变化
  • 104:Bugfix 2001
  • 111:变化

现在我想将我的分支合并回我的主干.如果我没有指定要使用的修订版,Subversion会尝试找出我需要合并的修订版.我从来没有将我的分支合并到我的主干,所以Subversion看到我的分支和主干之间的最后一个共同的祖先是修订版100.它然后看到我需要将更改103,110和112合并回我的主干.

但是我的分支上的修订版110是我已经合并到我的主干的更改!如果我不小心,我会尝试将这些更改合并到我的主干中导致冲突.

Subversion假设要处理这个问题,但并不总是那么干净.在运行合并之前,请执行以下命令:

$ svn mergeinfo --showrevs eligible $URL/branches/branch
Run Code Online (Sandbox Code Playgroud)

这将显示Subversion想要合并到我的主干的修订版.我应该查看该列表并确保这些更改尚未在我的主干上.

假设我看了一下这个列表,并意识到这个符合条件的列表包含修订版103,110和112.等一下.修订版103修复了Bug 2001,但已经在trunk上修复了.出于某种原因,还列出了修订版110,修订版110是我的主干到我的分支的合并.我也不想要考虑这个修订版.

我需要做的是告知Subversion不要考虑这些修订:

$ svn merge --record-only -c 103 -c 110 $URL/branches/branch
$ svn commit -m"Updating merge information to prevent collisions with 103 and 110"
Run Code Online (Sandbox Code Playgroud)

现在,我svn mergeinfo --showrevs eligible再次运行,这两个修订版将不会列出.我基本上已经告知Subverison这两组更改已经在我的主干中了.

--dry-run在完成之前,您始终可以使用它来尝试合并.如果指定要合并的修订,则Subversion合并始终有效.当您尝试让Subversion自行跟踪合并时,往往会出现问题.它肯定比以前更好,但Subversion可能会与复杂的情况相混淆.我们有一个项目,重新命名分支,更换主干,并在主干和其他两个分支之间进行合并.(不要问为什么.)

开发人员无法进行合并,因为他们最终发生了几百次冲突.看看符合条件的修订,我能够清理混乱,并使合并工作.

请记住尽早合并:经常合并,合并的可能性越大,任何冲突都很容易找到.尽量保持合并活动简单.如果您修复了两个不同分支上的错误,则需要让Subversion知道svn merge --record-only.

不管你做什么.不要惊慌.冲突将会发生,如果您了解如何解决冲突,您可以避免合并地狱.