hg:将更改传播到两个同等重要的分支的n倍

时间:2011-10-25 13:41:45

标签: version-control mercurial dvcs branching-and-merging

我之前曾经问过类似的问题(关于“采摘樱桃”),但我还没有真正找到解决问题的方法。大多数答案似乎假设有一个基本修订版,您可以从中实现更改 - 我实际上没有 - 所以我不确定设置我的存储库/分支的正确方法是什么。

我正在为学生可以在作业中使用的讲座创建框架;总会有学生收到的版本,以及正确的解决方案。这两个同样重要,它们都不是“主要分支”。此外,学生会为每个作业收到不同的框架迭代,并在每个作业中慢慢添加功能。

基本上:

  • assignment0
    • 任务
    • 溶液
  • 任务1
    • 任务
    • 溶液

每个作业都是以前作业的超集,只需稍微修改以前作业的文件。

什么是理想的存储库/分支设置/工作流,以便我可以轻松访问框架的不同迭代和版本,以便我可以轻松地将更改传播到框架所有其他分支?

用例:

  • 将vectorlib从HLSL更改为GLSL
  • 向1-3个文件添加功能
  • 平常,真的

2 个答案:

答案 0 :(得分:2)

我认为你真正得到的是一种情况,每个分配都是一个分支,每个分支都是从前一个分配中分离出来的。

-- assignment 0 -----
                 \
                  \-- assignment 1----
                                   \
                                    \-- assignment 2 ----

您所做的任何更改/错误修复都将发布到它适用的最早的分配分支。然后它将被合并到任何后来的任务中。

-- assignment 0 ------------------------------------------
                 \
                  \-- assignment 1---- bugfix -------\----
                                   \                  \
                                    \-- assignment 2 --M--

我认为任务和解决方案将是任务之间的中间步骤。 (可能任务和任务实际上是相同的事情)

-- assignment 0 ------------------------------------------
                 \
                  \-- task 0 -- \ ---------------------------
                                 \              
                                  \-- solution 0 -- \ --------
                                                     \
                                                      \ -- assignment 1-------

这将需要一些工作,因为你将有很多合并要做任何改变,但实际上你有大量的发布树。对于发布树,过程就是您可以在最早的分支中修复错误并将其合并。这里没什么区别。

答案 1 :(得分:0)

看起来像是Mercurial能够处理好的设置。我会维护一个简单的基本存储库,其中包含用于标记增量的分配。通过仅将这些部分推送到公共存储库,您只能使当前分配的部分可用。然后所有学生都可以克隆(分叉)它,当新的作业到时,只需告诉学生从下一个标签中拉出并合并更改。

因此,每个学生的克隆都是一个分支,并且通过将它们放在基础上然后合并它们来传播这些变化。如果存在冲突,学生将更适合处理它们,因为他们知道他们的代码和他们所做的更改。 (虽然他们可能不太熟悉版本控制和冲突解决,但我想让他们使用Mercurial就是教他们。)我不会推送更改给学生。

尝试视觉表现:

                  o -- o -- o [solution1] ------------------ o [solution2]
                 /                                          /
Base: o == o == o [assignment1] == o == o [assignment2] == o == o [assignment3]
                |\                      |\
Student 1:      | o -- o -- o ------------o (merge) -- o
                \                       |
Student 2:       o -- o -- o -- o ----- o (merge) -- o -- o

我认为解决方案应该像学生一样分配作业。毕竟,它们基本上都是解决方案,只是这个具有正式的批准印章。解决问题的另一个原因是因为它们会与学生的变化产生巨大冲突。

请注意,由于学生分支的更改从未合并(这实际上不可能),因此每次分配时冲突的几率会增加。所以你应该尽量保持你的代码和学生的代码尽可能模块化,这样可以减少冲突的可能性。