合并分支后,分支上的提交日志会发生什么?

41

场景:

  1. 程序员在版本5上为项目“foo”创建了一个名为“my_foo”的分支。
  2. 在开发“my_foo”功能过程中,程序员对多个文件进行多次更改。
  3. 在每个主要步骤结束时,比如向类添加多个新函数,程序员会对相应的文件进行svn commit提交,以将它们提交到分支。
  4. 几周后,在许多次提交(每次提交都有描述他所做的工作的提交日志)之后,程序员将分支合并回主干:
假设以下操作都是在主干的工作副本中完成: svn merge -r 5:15 file:///path/to/repo/branches/my_foo

哇,他已经将所有的更改合并回主干!众人欢呼雀跃,畅饮Mountain Dew。

现在假设一周后另一个程序员将其工作副本从版本5更新到版本15。“哇”,他说,“自版本5以来发生了什么变化”。程序员然后在其工作副本上执行 svn status ,结果如下:

------------------------------------------------------------------------
r15 | programmer1 | 2010-03-20 21:27:04 -0400 (Sat, 20 Mar 2010) | 1 line

将2.0版本更改合并到主干
------------------------------------------------------------------------
r5 | programmer2 | 2010-02-15 10:59:55 -0500 (Mon, 15 Feb 2010) | 1 line

将assets/images/tumblr_icon.png添加到主干

其他程序员提交到分支中的所有注释都去哪了?它们不会在合并过程中被拉取吗?我是疯了还是忘记了点什么?

4个回答

43

尝试使用svn log -g命令,以包含自Subversion 1.5以来存储的合并历史记录。


+1 绝对正确。但需要注意的是,如果合并替换了文件,则中间的修订记录将不会出现在日志中。(要识别替换的文件,在合并版本的 svn log --verbose 中将其标记为“R”)。这让我疯狂地想要理解为什么中间的修订记录会丢失。 - Shalom Craimer

15

TortoiseSVN在“显示日志”对话框底部有一个“包括已合并的修订版本”的复选框,可用于包括提交到分支的注释。


在使用svn合并时,有没有什么特别的操作可以将提交合并到主干中? - Cirelli94

9

此答案已过时,现在我们使用svn log -g


不,你并不疯狂。不幸的是,就是这样运作。

你所能做的最好的办法是,在合并的提交消息中包括分支 URL 和版本号,以便人们可以手动查找该分支的版本日志。(当然数据仍然存在)。

然而,你不知道哪些更改已进入主干,哪些未进入。

如果主干没有或只有很少的更改,那么将反向合并(从主干向分支合并),然后用分支替换主干可能是一个选择。这种推理也可以在单个子文件夹上实现(例如:用分支的 XML 解析器实现子文件夹替换,保留其余部分)。使用 svn delete、svn copy 替换文件夹会保留修订历史记录。

对于在合并期间新添加的文件,它们的修订历史记录可以从分支复制过来,如果你使用了 svn copy 命令。不确定合并命令是否支持此功能。

很有意思的是,是否有一个 svn 工具可以执行 "rebase"(如 git 或 Mercurial 中的操作)。这将为分支上的每个更改创建单独的提交。另一方面,也许单独的提交会造成太多的混乱。

我能给出的最好建议是使用一个好的 UI 工具,如 Trac,这样可以轻松地检查修订历史记录,以便你可以查看分支发生了什么。


非常好的信息,谢谢。跟进问题:一旦分支合并到主干,它不应该被删除吗,因为它不再需要了吗?还是应该永远保留?如果我删除一个分支,所有提交/修订数据是否都会随之消失? - Levi Hackwith
1
我建议尽快删除分支(即在所有内容已合并或变得过时时)以避免混乱。如果需要,您可以稍后恢复该分支(通过创建一个旧版本的副本作为新分支)。在Subversion中,没有任何东西被永久删除。 - Thilo
那么如果有人想查看已删除分支的提交记录,他们必须先检出该分支,然后执行svn log命令吗?或者他们可以直接使用svn log命令做些什么呢? - Levi Hackwith
如果您知道分支仍然存在的修订号(可以使用主干日志查找合并提交),则可以执行“svn log”。 - Thilo
2
这个解决方案并不是“你能做到的最好”,它应该提到 svn log -g - Will Sheppard

2

好的答案...如果您还想知道已签入的文件以及可能的分支名称,请将-v [--verbose]选项与-g [--use-merge-history]捆绑在一起。

示例:

svn log -vg

输出将包含已检入文件的完整路径(甚至是合并的分支),以及与合并中添加的文件相关的消息(来自“revision_url”)。

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