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

时间:2014-10-02 05:52:26

标签: svn version-control tortoisesvn svn-merge svn-reintegrate

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

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

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

我是否错过了合并成为最新的行李箱?

2 个答案:

答案 0 :(得分:6)

Subversion合并需要一些东西:

共同祖先

你认为这不是一件容易的事,但这种情况发生了很多。我见过使用svn mkdir创建分支的开发人员,检查该分支,将文件从主干复制到该分支,然后执行svn add将其添加回来。< / p>

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

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

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

修订版冲突

Subversion没有合并分支:它合并了变化。这是一个难以理解的概念,但它为Subversion提供了很多合并力。

我有一个我在第100版修改后创建的分支。

分支的修订历史

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

主干的修订历史

  • 102:更改
  • 104:Bugfix 2001
  • 111:更改

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

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

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

$ svn mergeinfo --showrevs eligible $URL/branches/branch

这将显示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"

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

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

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

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

无论你做什么。别恐慌。冲突将会发生,如果您了解如何解决冲突,您可以避免合并地狱。

答案 1 :(得分:0)

为了重新整合,您需要合并{<1}}之后发生 之后的所有修订,这些修订分支到您要重新整合的分支。

以下是一个例子:

  • Prev revs ...
  • Rev 20 - ( Trunk )提交新文件
  • Rev 21 - (功能分支)创建功能分支
  • Rev 22 - ( Trunk )从 Rev 20
  • 删除文件
  • Rev 23 - ( Trunk )处理随机文件
  • 第24版 - (功能分支)处理其他随机文件
  • Rev 25 - (功能分支)将修订 22 23 合并到功能分支
  • 第26版 - ( Trunk )将功能分支重新整合为中继

您会注意到,我们已将删除您的文件( Rev 22 )作为合并到功能分支( Rev 25 )的一部分。

现在这会为您创建一个新问题:

Rev 25 期间合并来自Trunk的更改时,您的Feature Branch所希望的文件将被删除。关于Trunk中实际发生的事情,这是真实准确的。您将在这里有几个选项:

  1. 如果Trunk中删除的文件在版本24 期间在Trunk中被修改,则在尝试按进行合并时,您会收到树冲突第25版。您可以在执行合并时使用本地更改将冲突标记为已解决。
  2. 执行仅记录合并 Rev 22 Feature Branch,然后执行Feature Branch所需的任何其他合并(这应该等同于我在#中提到的内容) 1)
  3. 根据 Rev 25 执行合并到Feature Branch。合并完成后,您可以查看Feature Branch的日志并还原在 Rev 25 (合并本身)中所做的更改,这些更改会删除您的文件,方法是选择文件并还原每个文件。这些撤消将把文件恢复为要添加到Feature Branch存储库的新文件。 请注意,这些文件在历史记录中与原始文件不同。就SVN而言,这些被视为全新的文件,因此它们不会与原始对手共享任何血统