将主干合并到分支

3
这是第一次尝试将主干中的最新版本合并到我的分支中。我只想将团队中其他开发人员的最新更新获取到我的分支中。我正在使用Subversion 1.6.7。因此,在合并对话框中,我选择了“合并2个不同的树”选项。
我的问题是:
我的分支的最新修订版本是358,而主干版本是357。因此,当我进行测试合并时,它会删除358(我的分支)中的任何新内容。在这种情况下,我应该从我的主干到分支而不是从分支到主干吗?我知道在各种博客的示例中,他们说要从分支到主干,但在我的情况下,分支具有更高的修订版本号。
现在在测试合并过程中,我不明白为什么它要删除那些在我的主干中不存在的文件(在开发过程中我已经添加到我的分支中)。

alt text http://elbalazo.net/post/mergeoptions.jpg

alt text http://elbalazo.net/post/revisiongraph.jpg

alt text http://elbalazo.net/post/deleted.jpg

现在让我们做相反的操作...我认为应该这样做(因为我要从较低的修订版本(357)到较高的修订版本(358)。所以它是从主干分支到我的分支:

alt text http://www.elbalazo.net/post/mergdialog_trunk_to_branch.jpg alt text http://www.elbalazo.net/post/testmerge_trunk_to_branch.jpg 在下面的评论后更新:

好的,当我尝试主干到主干时,这就是我得到的结果:

替代文字 http://www.elbalazo.net/post/merge_trunk_to_trunk.jpg

替代文字 http://elbalazo.net/post/testmerge_trunk_to_trunk.jpg


显然,我不能反过来做,因为那样会产生大量的树冲突。 - PositiveGuy
我不确定这是否正常。如果不是,那么我该如何防止第一次(从分支到主干)删除我在分支中创建的任何新文件...因为它会在测试合并后将它们删除。 - PositiveGuy
似乎这篇文章(使用了一个旧版本的Tortoise)已经不再真正有效了:http://weblogs.asp.net/bsimser/archive/2008/05/06/day-to-day-with-subversion.aspx。因为它告诉我要从分支文件夹URL转到主干trunk URL,以将最近发生在主干trunk中的更改移动到您的分支中。 - PositiveGuy
感谢大家的回复。你们帮我澄清了这个非常令人困惑的主题。 - PositiveGuy
Mike,你所说的“分支同步东西”是什么意思? - PositiveGuy
显示剩余2条评论
4个回答

6

Tortoise合并非常好用,但需要掌握其中的技巧。

在合并时,首先使用顶部单选按钮选项(合并一系列版本),并始终合并到目标工作副本中。因此,在目标工作副本上右键单击,选择合并,然后编辑合并对话框中的URL,使From:字段包含您想要从中获取更改的分支。

当你第一次看到它时可能有点反常规,但是一旦你理解了正在发生的事情——即将合并对话框中URL中的所有更改应用于工作副本,就会感到更加合理。这是需要理解的诀窍——你不是像手动合并文件那样进行合并,而是重新应用源分支中所做的更改。

使用“显示日志”按钮选择想要的版本。如果有合并信息(即之前合并过的版本),它们将显示为灰色。

另一个问题是SVN对于树冲突的处理能力不是太好——如果您已经添加或删除了一个目录,则SVN会询问您想要发生什么(例如,树冲突)。你需要做的就是解决该目录,并选择实际被删除或添加的项目。这是因为它无法确定文件是否已被删除(或添加)或仅仅是重命名。

现在我经常进行合并——非常容易——但我认为我从未在第一个对话框中使用其他两个合并选项。始终将URL中的更改合并到您的工作副本中;一旦合并完成,您可以查看结果并在满意后提交它们。


嗯,我不会想到选择“修订范围”,但我想这是有道理的,因为你实质上是将一个或多个主干修订合并到你的分支中。 - PositiveGuy
现在我很困惑应该使用哪个选项,因为对我来说,最后一个选项(我正在使用的那个)似乎是用来执行这样的合并操作的。 - PositiveGuy
1
如果Tortoise的文件能够解释可能出现的情况并提供一些关于此主题的好教程,那就太好了。例如合并主干和分支等实际示例。我在他们的文档中没有看到与合并相关的内容,除了使用合并工具查看更改。这是一个非常成熟的开源项目,令人惊讶的是,其中没有任何内容来更加真实地解释这些问题。 - PositiveGuy
无论您选择哪个选项,只要选择一个可行的即可 :) - Ken Liu
@gbjbaabn:Tortoise 提供了一个反向合并选项,可以让您朝相反的方向前进。 - Casebash

2

我认为你没有选择正确的URL进行合并。你应该右键点击你想要合并的分支,选择合并,然后从"trunk"分支中选择两个版本来进行合并。


我正在右键单击我的分支文件夹并选择合并,以确保正确性。但是我不明白为什么在合并测试对话框中它似乎正在添加/更新所有的主干更改,但是会删除我在分支中添加的任何不存在于主干中的新文件。为什么它要删除我在分支中创建的新文件?它不应该触及那些文件,只应该添加更改(添加存在于主干中但尚未存在于我的分支中的文件)或合并更改(将主干文件的新更改合并到存在于我的分支中的相同文件中)。 - PositiveGuy
我的工作副本就是我的分支,这就是我右键单击以获取上述内容的原因。在合并对话框中,我将 TO 更改为我的主干。 - PositiveGuy
1
FROM和TO字段都应该是主干版本,否则您将得到奇怪的结果。我认为您想要FROM = 344和TO = HEAD。 - Ken Liu
1
是的。以这种方式进行可视化:当您右键单击分支时,您告诉Tortoise要将哪个分支合并到。然后,“Merge”对话框用于在您正在合并的分支上选择两个点。 TO和FROM字段是沿该线的两个点。如果您将主干视为另一个分支,那么这就有意义了。 - Ken Liu
1
在版本357和358之间没有任何更改。您需要344-357。 - Ken Liu
显示剩余6条评论

2
在这种情况下,您应该从分支到主干进行合并,而不是从主干到分支。修订号并不确定你应该怎么做,重要的是:你想合并什么?你想把在分支中创建的更改移回主干,还是想把主干中的更改移动到分支中?
如果您想将更改从分支移到主干(通常情况下,如果您使用分支“预期效果”),那么将分支r345-358合并到主干中。否则,反过来做。
编辑:您在上面的截图中所做的是将差异从rev 358到rev 357,并将其合并到您的工作副本中。由于您在提交358和357-358之间添加了文件,因此差异将执行相反的操作,即删除文件。

那么你的意思是合并是与主干/分支无关的,它只考虑按修订号进行合并,不管它是主干还是分支?我知道在合并选项中,这就是你决定是否将其合并到分支或主干的地方。所以你之前说过,应该将它们都变成主干,因此它只会寻找要合并的修订号,这才是它真正关心的。 - PositiveGuy
这个东西真是他妈的令人困惑。我知道Subversion和Tortoise一起可以做很多事情,但是老天,要弄清楚它们到底如何工作,真是一件令人头疼的事情。 - PositiveGuy
也许可以这样想:假设您在两个框中都放置了主干URL,"从"字段中放置了r.10,"到"字段中放置了r.20(我只是举例说明)。然后,您对SVN说的是:“创建一个脚本(在SVN术语中称为“补丁”),当应用于r10的内容时,将使内容与r20相同。然后将该脚本应用于我的工作副本”。因此,在您的示例中,您要对SVN说:“创建一个脚本,使r.357与r.358相同。然后将其应用于我的工作副本”。由于从r357到358会添加文件,因此将脚本应用于您的工作副本也会添加文件。 - Rune
1
是的!你上面说的完全正确:-)。当你完成合并后,你会提交你的工作副本(这将把它提交到分支),这样你就将变更从主干移动到了分支。 - Rune
1
啊,抱歉,我的错,我一直搞错了修订号 :-(。由于在 r.357 和 r.358 之间没有向主干添加任何文件,所以合并是空的。你想做什么?如果你想移动分支创建后对主干所做的所有更改,你需要将范围 trunk(344) 到 trunk(357) 合并。 - Rune
显示剩余15条评论

0

如果您的意图只是将所有主干更改合并到您的分支中,而这些更改尚未存在于其中,那么您根本不需要指定修订版本范围(在步骤之后进行解释)

我认为这应该是您的工作流程:

  • 右键单击干净(没有修改)的工作副本分支
  • 选择“合并一系列修订版本”并点击下一步
  • 在“要合并的URL”中填写主干的URL并点击下一步(不要填写修订版本字段)
  • ...测试合并或执行合并。

由于您使用的是带有合并跟踪的Subversion版本1.6,因此不指定修订版本范围将使用Subversion的合并跟踪,并将合并任何未标记为已合并的修订版本到分支中。

如果这是您第一次将任何内容从主干合并到分支中,则意味着从您创建分支的修订版本之后到主干HEAD修订版本的任何内容都将合并到您的分支工作区中,然后当您提交该合并时将被记录。如果您决定一周后再次同步您的分支,使用相同的步骤,它只会合并以前未合并的主干中的任何修订版本。


当你说一个干净的分支时,是指在我将最新版本提交到我的分支后,还是指获取最新版本(新鲜的)到我的分支的新目录(新工作区)? - PositiveGuy
一个新鲜的工作分支副本,或者至少是没有未提交修改的副本。(如果你执行“显示修改”,则不应该返回任何内容)。 - Joshua McKinnon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接