我可以在不执行合并的情况下从主干更新分支吗?

Posted

技术标签:

【中文标题】我可以在不执行合并的情况下从主干更新分支吗?【英文标题】:Can I update a branch from the trunk without performing a merge? 【发布时间】:2011-01-23 06:22:50 【问题描述】:

我可能只是没有考虑过这一点,或者我只是不知道 Subversion 中已经存在一个选项(我当然不是专家)。

我只是想知道,如果我创建了一个分支来开始开发一些新功能,是否有更简单的方法可以让分支与 trunk 的最新版本保持同步修订版,而不必经历合并一系列修订版的所有麻烦。我希望能够简单地更新并从主干(分支,当然)中获取所有修订,而我提交的更改只影响分支。这可能吗?我问的有道理吗?

我想这与合并一系列修订版并没有必然的不同;只是我使用了 AnkhSVN,它在允许合并之前执行所有这些最佳实践检查,有时感觉它比它需要的复杂得多。这个想法是我想让我的分支与其他开发人员可能对主干所做的任何提交保持最新,这样当我最终将我的分支合并到主干时,一切都会进行(如) 顺利(尽可能)。

【问题讨论】:

【参考方案1】:

使您的分支与最新的主干签入保持最新状态称为合并。

我知道合并有时可能是一场王室噩梦,但这正是合并的意义所在。

【讨论】:

@Jack:我怀疑这将是一般答案。那么,也许我的问题应该是,为什么合并比简单的更新要复杂得多? 因为合并必须处理冲突的变化? @sbi:不过,更新也是如此,可能。 拥有主干和分支意味着拥有两条开发线。把它想象成一棵树的根的两条路径。如果您想从另一行检索更改,它不能太简单,对吧:)? @Dan:是的,更新也是如此,而且有时也会造成伤害。但是,通常会创建分支,因为事先知道会在更长的时间段内发生冲突的编辑 - 因此您更有可能遇到冲突。 (并且不要忘记那些将两个具有冲突更改的分支合并到具有更多本地更改的工作副本的时候。这很有趣......)【参考方案2】:

TL;DR;不,你必须合并,这里有一些说明

它并没有你想象的那么糟糕。我将概述我使用的命令行中的步骤。我将使用 vimidiff 来管理您可以使用 Meld 或其他您喜欢的差异工具的冲突。命令前面有井号“#”标记

<in branch first time from copy>
# svn log --stop-on-copy | tail 
<read the revision that was the copy instruction in this case r229>
# cd ../../trunk
# svn up
<I make note of the latest rivision which is r334>
<now I go back to the branch>
# cd ../branches/branch 
# svn merge -r229:334 svn://url.to.svn.server/project/trunk
<a whole bunch of stuff happens>
< now I check for conflicts >
# svn status | grep ^C
<which outputs something like>
C       public/tools/Diagnostic.class.php
C       public/domain/Report_Setup_Parameter.class.php
C       public/modules/mReports.module.php
<I now revert all these and manually merge them>
# svn revert public/tools/Diagnostic.class.php
...
<revert done now manuall doinng the merge
# vimdiff public/tools/Diagnostic.class.php ../../trunk/public/tools/Diagnostic.class.php
...
<now all the changes are done>
# svn commit -m "Merging trunk into branch 'branch' r:229:334"
commited revision 335

完成,如果你经常这样做,那么没有太多变化。第一次合并后,您需要使用最后一次合并的修订号。因此,在未来的某个时间,该命令将在 svn 日志中查找上次合并的修订版本,在本例中为 335。合并命令看起来像这样

# svn merge -r335:370 svn://url.to.svn.server/project/trunk

所有其他步骤都相同。

【讨论】:

【参考方案3】:

我的想法是我想保留我的 使用任何提交进行最新的分支 其他开发人员可能正在 后备箱,这样当我最终做 将我的分支合并到树干中, 一切顺利(如)顺利(如 可能)。

要实现这一点,您需要从主干进行范围修订合并。实际上,不时对分支进行这种合并是一种很好的做法,以便及时了解主干中发生的情况。

我不了解 AnkhSVN 的工具,但“纯”SVN 有非常好的工具,可以让合并操作变得非常简单。 TortoiseSVN 是一款适用于 Windows 的出色工具,如果您喜欢 Netbeans,它还提供了非常不错的合并图形支持。

【讨论】:

【参考方案4】:

我不熟悉 AnkhSVN,但您所描述的正是 svn merge 的用途。所以你的问题的答案是否定的。

不过,您可以查看--reintegrate 选项,看看这是否能让您的生活更轻松。

查看这些博文:

Subversion merge reintegrateSubversion 1.5 merge-tracking in a nutshell

【讨论】:

这个答案的第一部分很好,但是在将分支合并回主干时使用了--reintegrate选项,因此它并不真正适用于该问题。 @ChrisH 他特别提到合并回主干是该过程的最后一步,因此为了完整起见,我将其包括在内。 很公平。我只是认为它可以使用一些澄清,因为从主干到分支时使用 --reintegrate 会导致问题。回想起来,我应该将我的第一条评论作为澄清。【参考方案5】:

如果您使用的是 PHPStorm,您可以尝试使用 GUI 界面 https://www.jetbrains.com/help/idea/2016.1/integrating-changes-to-from-feature-branches.html

【讨论】:

以上是关于我可以在不执行合并的情况下从主干更新分支吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在不使用管道的情况下从 Azure Synapse 查询 SQL Server 数据库吗?

如何在不指定列名的情况下从另一个表更新一个表?

Angular 4在不使用服务的情况下从另一个组件执行功能

我可以在不按任何选择按钮的情况下从我的 uipickerview 行的值自动更新我的 uitextview 吗?

在不使用反向补丁的情况下从分支中删除旧的 Git 提交? [复制]

SVN 如何把主干上的修改合并到分支上来