对hello-world做产品发布,版本号定为v1.0,创建一个新的里程碑,并推送到远程共享版本库:
版本2.0开发计划:user1开发命令行解析功能;user2开发多语言支持功能。
分支管理命令:
1、命令:git branch
显示本地分支列表,当前分支用星号*标识出来。
2、命令:git branch <\branchname>
基于当前头指针(HEAD)指向的提交创建分支,新分支名为branchname。
3、命令:git branch <\branchname> <\start-point>
基于提交start-point创建新分支。
4、命令:git branch -d <\branchname>
删除分支branchname时会检查所要删除的分支是否已经合并到其他分支中,否则拒绝删除。
5、命令:git branch -D <\branchname>
强制删除分支branchname,即使该分支没有合并到任何一个分支中。
6、命令:git branch -m <\oldbranch> <\newbranch>
如果版本库中已经存在名为branchname分支,则拒绝执行重命名。
7、命令:git branch -M <\oldbranch> <\newbranch>
强制重命名分支。
一、基于特性分支的开发
采用分支将某个功能或模块的开发与开发主线独立出来。
试验性、探索性的功能开发应该为其建立特性分支。功能复杂、开发周期长的模块应该为其建立特性分支。
1、创建分支user1/getopt,并进行切换
分支是创建在目录.git/refs/heads下的引用,版本库初始时创建的master分支就是在该目录下:
因为user1/getopt是基于头指针HEAD创建的,因此当前该分支和master分支的指向是一致的:
2、修改工作区和暂存区
使用里程碑jx/v2.0标记的内容替换
3、比较暂存区和HEAD的文件差异:
4、user1提交代码,完成开发
5、此时两个分支的指向不同:
将user1/getopt分支合并到开发主线
1、将工作区切换到主线,即master分支:
2、执行合并命令
3、查看合并日志
4、查看状态,显示本地版本库比远程共享版本库领先:
5、执行推送,完成本地分支向远程分支的同步
6、合并到主线之后,可以删除分支
二、基于发布分支的开发
避免对已发布的软件版本进行BUG修正时引入新功能的代码,或者因误删其他BUG修正代码导致已修复问题重现。使用发布分支,在软件新版本发布后经常使用此技术进行软件维护,发布新版本。
如果用户发现两个BUG提交到项目组。
但是此时共享版本库中的master分支相对于之前的版本v1.0添加了新的代码,即开发者user1之前推送的getopt相关的代码。如果直接在master中进行修改BUG,会引入新功能的代码getopt(不稳定或未经测试)。
创建发布分支
1、软件V1.0版本在版本库中有一个里程碑相对应,这是创建里程碑的好处:
2、基于里程碑v1.0创建发布分支hello-1.x
命令:git checkout -b <\new_branch> [<\start-point>]
实现创建分支和切换分支两个动作的合二为一。且主动切换到新分支。<\start-point>既可以是里程碑,也可以是提交ID。
3、查看指向ID:
因为v1.0是新分支hello-1.x创建的基准点,对应的提交ID是一致的
4、user1将分支hello-1.x推送到远程共享版本库,因为开发者user2也要用到该分支修改BUg。
5、user1对BUG进行修改(先创建分支,再在分支上进行修改):
6、执行提交
7、推送到远程共享版本库
user2获取分支hello-1.x后进行修改(如果user2获取分支hello-1.x的操作在user1提交之前,那么user1推送到远程版本库之后,user2修改完成也推送到远程版本库,那么会导致出现非快进式推送问题,合并出现问题,当前远程提交ID并不是user2提交的父提交。因为远程提交ID被user1覆盖了)
本次user2获取是在user1提交之后,不会出现非快进式提交。
在操作之前git pull。保证本地版本库与远程共享库一致。
1、user2从远程版本库获取分支hello-1.x
将远程共享本版块的新分支hello-1.x复制到本地引用refs/remotes/origin/hello-1.x上:
2、user2切换到本地hello-1.x分支
因为origin/hello-1.x是远程分支,不能被直接检出,而是需要基于该远程分支创建本地分支。
3、user2修改BUG并提交修改:
4、user2合并推送到远程版本库
5、将发布分支合并到主线
利用拣选命令,可以直接将发布分支上进行的BUG修正合并到主线上。
5.1、user2切换分支到master
5.2、从远程版本库同步master分支,查看日志,确认要拣选的提交ID。第一个父提交bugfix..使用hello-1.x^1表示。
5.3、执行拣选操作
5.4、执行推送命令,将本地master分支同步到远程共享版本库
(上面部分过程有差异,过程仅供参考)