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。