18.5 基于发布分支的开发

用户在使用1.0版的hello-word过程中发现了两个错误,报告给项目组。

第一个问题是:帮助信息中出现文字错误。本应该写为"—help"却写成了"-help"。

第二个问题是:当执行hello-world的程序,提供带空格的用户名时,问候语中显示的是不完整的用户名。

例如执行"./hello Jiang Xin",本应该输出"Hi,Jiang Xin.",却只输出了"Hi,Jiang."。

为了能够及时修正1.0版本中存在的这两个Bug,将这两个Bug的修正工作分别交给两个开发者user1和user2完成:

开发者user1负责修改文字错误的Bug。

开发者user2负责修改显示用户名不完整的bug。

现在的版本库中master分支相比1.0发布时添加了新功能代码,即开发者user1推送的用getopt进行命令行解析的相关代码。如果基于master分支对用户报告的两个Bug进行修改,就会引入尚未经过测试、可能不稳定的新功能的代码。在之前“代码管理之殇”中介绍的发布分支,恰恰适用于此场景。

18.5.1 创建发布分支

要想解决在1.0版本中发现的Bug,就需要基于1.0发行版的代码创建发布分支。(1)软件hello-world的1.0发布版在版本库中有一个里程碑相对应。


$cd/path/to/user1/workspace/hello-world/

$git tag-n1-l v*

v1.0 Release 1.0


(2)基于里程碑v1.0创建发布分支hello-1.x。

注:使用了git checkout命令创建分支,最后一个参数v1.0是新分支hello-1.x创建的基准点。如果没有里程碑,使用提交ID也是一样。


$git checkout-b hello-1.x v1.0

Switched to a new branch 'hello-1.x'


(3)用git rev-parse命令可以看到hello-1.x分支对应的提交ID和里程碑v1.0指向的提交一致,但是和master不一样。

提示:因为里程碑v1.0是一个包含提交说明的里程碑,因此为了显示其对应的提交ID,使用了特别的记法"v1.0^{}"。


$git rev-parse hello-1.x v1.0^{}master

ebcf6d6b06545331df156687ca2940800a3c599d

ebcf6d6b06545331df156687ca2940800a3c599d

0881ca3f62ddadcddec08bd9f2f529a44d17cfbf


(4)开发者user1将分支hello-1.x推送到远程共享版本库,因为开发者user2修改Bug时也要用到该分支。


$git push origin hello-1.x

Total 0(delta 0),reused 0(delta 0)

To file:///path/to/repos/hello-world.git

*[new branch]hello-1.x->hello-1.x


(5)开发者user2从远程共享版本库获取新的分支。

开发者user2执行git fetch命令,将远程共享版本库的新分支hello-1.x复制到本地引用origin/hello-1.x[1]上。


$cd/path/to/user2/workspace/hello-world/

$git fetch

From file:///path/to/repos/hello-world

*[new branch]hello-1.x->origin/hello-1.x


(6)开发者user2切换到hello-1.x分支。

本地引用origin/hello-1.x称为远程分支,第19章将专题介绍。该远程分支不能直接检出,而是需要基于该远程分支创建本地分支。第19章会介绍一个更为简单的基于远程分支建立本地分支的方法,本例先用标准的方法建立分支。


$git checkout-b hello-1.x origin/hello-1.x

Branch hello-1.x set up to track remote branch hello-1.x from origin.

Switched to a new branch 'hello-1.x'


[1]该引用的全称为refs/remotes/origin/hello-1.x。