分支 ( branch )这个术语,有些时候被用来表示稍有不同的概念。这可能会给水银(Mercurial)的新用户带来困扰。
如果开发 的路径(lines)发生分叉(diverge),就会产生分支。因此,“分支”这个术语,可用于表示“开发路径的分叉”。对于水银来说,“开发路径”,就是,一些连续的 变更集 组成的线性序列。
将某个开发路径与一个已有的开发路径组合起来的动作,就叫做 合并 。
1. 创建一个分支
在单个 仓库 中提交变更集,或者在不同(但相关)的仓库中提交有分歧的变更,都可能产生分支。如果两个仓库最初 是从同一个仓库复制出来的,但是之后产生了分歧的话,则我们说这两个仓库之间是相关的。
相反 的是,合并——将两个有分歧的开发路径组合在一起的动作——只能 在单个仓库中进行。如果 妳想要将某个只存在于另外一个相关的仓库中的有分歧的开发路径合并进来的话,则,妳必须先从那个仓库中将该开发路径 的 头头 拉取到妳的本地仓库中,然后进行合并。
1.1. 单个仓库的情况
严格 地说,以下情况下,就会产生一个新的分支:某个用户在仓库R0 中创建了一个新的变更集C2,而它的亲代变更集 P之前已经 有了一个子代变更集 C1 ,也就是说,向亲代变更集P 添加了第二个子代变更集C2。 这就会向仓库R0 加入一个新的头头。
1.2. 两个仓库的情况
分支的产生,也可以在两个不同的仓库R1和R2之间产生,这两个仓库中都包含着相同的亲代变更集P,一个用户在R1 中以 P 为亲代添加一个新的变更集C1,而第二个用户(也可以是同一个用户)在 R2 中以相同的变更集P 作为亲代添加另一个新的变更集C2。从那个时刻开始,这两个仓库都可以被看作一个“分支”。
本身呢,水银中的每个变更集都是某个分支中的一个元素。因此,可以这样说,某个变更集“属于某个分支”。按照那个定义来看,一个分支,可以简单地看作由变更集组成的线性序列。
2. 有命名的分支
水银支持 给分支起 名字 ,具体作法 就是,利用变更集的分支名字属性(参考 命名分支 )。如果没有设置分支名字 的话,则水银会将分支名字赋值为 "default" 。所以,每个仓库中的默认分支的名字就是 "default" (这个名字一般不会显示,例如当妳执行 hg log 的时候就不会显示)。
使用 hg branches 命令 可列出某个仓库中存在的所有分支名字:
列出当前仓库中的命名分支,并显示出哪个分支是非活跃的。如果指定了活跃( active )选项,则只会显示活跃的分支。
使用"hg -v help branches"来显示全局的选项
可使用 hg branch 命令 来设置分支名字,新设置的分支名字会在后续的提交中使用:
如果不带参数,则显示当前的分支名字。如果带一个参数, 则设置工作目录的分支名字(直到下一次提交,这个分支才会出现在仓库中)。
除非使用了 --force选项,否则,branch命令 不允许妳设置的新的分支名字屏蔽掉某个已有的分支。
-f --force 即使 这个名字会屏蔽掉某个已有的分支,也设置这样一个分支名字
用户可以出于任何原因来使用水银的分支名字。然而,有一个比较好的执行规则就是,少量地使用分支名字,在使用的时候只用于生存周期较长的事务(例如“发布用的分支”(rel-1、rel-2等等)),而不是用于单个开发者的短期工作的区分。
有些水银用户根本就不用分支名字。而且,实际上,在水银中,确实没有给分支赋予名字的必要性。有些用户觉得这个特性狠有用,有些用户却不觉得有用。只要在妳们自己的项目组中保持一致就行了。
3. 这是变更集的一个属性
(来自 于 水银邮件列表 上Yao Zhang 的一个 帖子 )
在这两个概念之间有个微妙的区别:"发生分歧的开发线";和水银"分支"名字。
在水银中,分支名字是与单个变更集相关联的一个属性。新的分支名字可以在开发线的中间开始出现,而不是只会在发生分歧的那个时间点开始出现。例如:
hg branch branch-1 # 产生一个新的分支名字
hg commit -m "branch-1" # 这个变更集的分支名字就是"branch-1"
hg branch branch-2 # 产生另一个分支名字
hg commit -m "branch-2" # 这个变更集的分支名字就是"branch-2"
尽管上面这个示例中没有发生“有分歧的开发线”,但是水银分支名字仍然可以被改变。
另一个示例就是,如果日后出现了“有分歧的开发线”,则,在没有启用新的分支名字的情况下,两条分歧的开发线都会继承亲代分支名字。
