在团队开发中,如果总是在master分支上进行开发,会导致版本管理混乱,不容易进行版本的恢复操作,这个问题在本地的团队开发中并不会很突出,因为出现问题时沟通比较容易,但如果是在互联网开发中,团队之间的沟通不太容易,如果版本管理混乱,特别是在版本需要回滚的时候会存在比较严重的问题,所以有效的利用分支进行管理会使整个项目的版本比较清晰。
在分支管理的章节中已经详细介绍了基于git-flow的管理方式,当然在实际的开发中并不一定非要遵循这个规则,可以由团队的开发人员共同协商出一个比较好用的分支管理模式,以下内容是个人在开发中使用的方式,不一定是最好的,但已经可以很好的满足我们在开发中的需求。
此处同样是以两个用户来进行模拟整个git的管理流程
开发初步
以kh121在github上创建项目p2,并且对项目进行初始化,之后clone到本地
[root@localhost test]# git clone https://github.com/kh121/p2
[root@localhost test]# ls
git p1 p2
此时存在了master分支,接着创建一个develop分支,所有的开发都要在develop分支上进行,master分支只是用来做合并,并不会进行开发。
[root@localhost p2]# git checkout -b develop
[root@localhost p2]# git branch
* develop
master
基础搭建完毕之后将该分支提交到github中,默认使用push提交是,只会提交master分支,由于此时master分支没有任何的变动,所以无法提交。如果希望提交develop分支需要使用git push origin develop
提交,也可以使用git push --set-upstream origin develop
,如此可以将develop分支添加到config中,将来使用push提交时即可以把master和develop分支都提交到github中。
root@localhost p2]# git push
Everything up-to-date ##默认push只会提交master,所以提示没有更新
[root@localhost p2]# git push --set-upstream origin develop ##此时会将develop分支添加到config的中,以后使用push即可完成提交
* [new branch] develop -> develop
Branch develop set up to track remote branch develop from origin.
查询一下github,我们可以发现已经有了两个分支。
github基于分支的协同开发远端分支介绍
将另外一个用户添加为项目的合作者,并且完成clone操作。
E:\study\git_2016\12>git clone git@github.com:kh121/p2
E:\study\git_2016\12\p2>git branch #此时只是查询本地分支,默认情况本地分支是master
* master
E:\study\git_2016\12\p2>git branch -a ##查询所有分支
* master
remotes/origin/HEAD -> origin/master
remotes/origin/develop
remotes/origin/master
使用git clone操作之后,只会把默认分支同步下来,此处的默认分支是master,所以当执行git branch的时候,我们只看到了master一个本地分支,需要通过git branch -a命令可以查询所有的分支,我们发现多了 remotes/origin/xx等3个分支,第一个表示远端最新的分支,其实就是一个引用名称,第二个remotes/origin/develop表示远端的develop分支,而第三个remotes/origin/master就是远端的master分支,该分支已经下载到了本地分支中,以remotes开头的这些分支表示远端的追踪分支,虽然可以进行checkout并且修改,但是强烈建议不要这样做,如何要使用到这些远端分支中的内容,可以自己创建一个分支来进行合并。
另外就是远端的默认分支是可以修改的。修改之后当再次进行clone操作,Develop分支就会成为默认的本地分支。
github基于分支的协同开发当完成clone之后,新建一个develop分支,并且合并远程的develop分支。
E:\study\git_2016\12\p2>git checkout -b develop
Switched to a new branch develop
E:\study\git_2016\12\p2>git merge remotes/origin/develop
创建新功能
下一步就是功能的分配,假设kh121分配了fun1的功能,而ynkonghao分配了fun2功能,此时各自在自己的develop分支上创建一个feature/功能名称
的分支来做自己的开发。
对于kh121而言具体的执行步骤:
- 创建feature/fun1
- 增加一些功能并且完成提交
- 合并到Develop分支
- 删除feature/fun1分支
- 提交分支到github
##创建feature/xx分支
[root@localhost p2]# git checkout -b feature/fun1 develop
Switched to a new branch 'feature/fun1'
##添加和提交一些新功能
[root@localhost p2]# git add .
[root@localhost p2]# git commit -m "finish func1"
##切换到Develop分支并且合并feature/fun1分支
[root@localhost p2]# git checkout develop
Switched to branch 'develop'
[root@localhost p2]# git merge feature/fun1
##删除develop分支
[root@localhost p2]# git branch -d feature/fun1
Deleted branch feature/fun1 (was f875e41).
##提交分支,由于已经在config中添加了develop分支,此处直接push即可,而且在执行push之前还是进行一下pull的操作,让自己的版本和github一致
[root@localhost p2]# git pull
Already up-to-date.
[root@localhost p2]# git push
对于ynkonghao用户而言,同样执行相同的步骤,只是创建的功能是fun2,但是在具体的操作过程中有一些区别。
##创建feature/fun2分支
E:\study\git_2016\12\p2>git checkout -b feature/fun2 develop
Switched to a new branch 'feature/fun2'
##添加fun2功能并且完成版本提交
....
E:\study\git_2016\12\p2>git commit -m "add fun2"
##功能开发完毕,切换回develop分支,合并feature/fun2分支,并且删除fun2分支
E:\study\git_2016\12\p2>git checkout develop
Switched to branch 'develop'
E:\study\git_2016\12\p2>git merge feature/fun2
E:\study\git_2016\12\p2>git branch -d feature/fun2
Deleted branch feature/fun2 (was e12c5d6).
##从远程github仓库中更新分支
##直接使用git pull并不会从远程分支中获取数据,因为git pull默认从master分支获取数据,而开发都是在develop分支上,此时需要手动指定pull的分支或者通过set-upstream将develop分支设置到config文件中
E:\study\git_2016\12\p2>git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
##此时即可获取远程仓库中的数据
E:\study\git_2016\12\p2>git pull origin develop
From github.com:kh121/p2
##将fun2功能推到github,并且将develop分支添加到config中,以后使用pull即可拉取develop中的数据。
E:\study\git_2016\12\p2>git push --set-upstream origin develop
Counting objects: 6, done.
以上操作完成了fun2功能的开发,是基于ynkonghao这个用户来进行的,需要注意的是在git pull的时候,由于此时该本地仓库中并没有把develop分支添加到config的配置中,只会默认拉取master分支的内容,所以执行pull的时候需要指定分支git pull origin develop
,而在push的时候通过--set-upstream将develop分支添加到git的config的配置中,以后就可以直接使用pull拉取develop分支的内容。
此时对于kh121用户而言,只要执行git pull,即可拉取fun2,两个用户在develop分支上功能保持了一致。以后如果有新的功能,只要继续创建feature/功能名称的分支即可。
版本发布
当整个项目开发完毕之后,就需要发布项目,此时才会涉及到master分支,发布产品其实就等于把develop上的功能合并到master分支中,很多时候,发布之前还需要对一些bug进行修正,所以通常还会在develop分支上创建一个release分支,该分支会持续一段时间,给开发人员进行最后的调试,调试完成之后将该分支合并到master上,并且为该版本增加tag。最后在develop分支上合并并且删除release分支。并使用git push将版本信息推送到github中。
##在Develop的基础上创建release分支
E:\study\git_2016\12\p2>git checkout -b release-0.0.1 develop
Switched to a new branch 'release-0.0.1'
##编写说明文件并且完成提交
E:\study\git_2016\12\p2>echo finish version0.0.1 > release-0.0.1.md
E:\study\git_2016\12\p2>git add .
E:\study\git_2016\12\p2>git commit -m "finish version0.0.1"
##在master分支上合并release分支
E:\study\git_2016\12\p2>git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
E:\study\git_2016\12\p2>git merge release-0.0.1
##为版本增加一个标签
E:\study\git_2016\12\p2>git tag release-0.0.1
##切换回develop分支
E:\study\git_2016\12\p2>git checkout develop
Switched to branch 'develop'
Your branch is up-to-date with 'origin/develop'.
##合并release-0.0.1分支并且删除该分支
E:\study\git_2016\12\p2>git merge release-0.0.1
E:\study\git_2016\12\p2>git branch -d release-0.0.1
Deleted branch release-0.0.1 (was 4f29e83).
##将所有的分支推送到github中
E:\study\git_2016\12\p2>git push --all
##将标签信息推送到github中
E:\study\git_2016\12\p2>git push --tags
Total 0 (delta 0), reused 0 (delta 0)
To github.com:kh121/p2
* [new tag] release-0.0.1 -> release-0.0.1
需要注意,在推送的时候使用git push --all命令,可以将master和develop分支都推送到远端,但此时tag信息不会被推送。还需要使用git push --tags命令推送标签信息。
此时通过浏览器访问github
github基于分支的协同开发显示了有5个commit,1个realase的版本和两个分支。在kh121的机器上可以使用git pull --all
把所有的信息拉取到本地。
修正release版本
版本发布之后,如果要继续进行开发,同样在develop分支上创建feature/xx分支来进行,但是此时如果发现原来发布的版本有bug,就需要在master分支上创建hotfix分支来修正已经发布版本的bug
##创建hotfix分支,在master分支的基础上
E:\study\git_2016\12\p2>git checkout -b hotfix/bug_in_fun1 master
Switched to a new branch 'hotfix/bug_in_fun1'
##模拟修改bug
E:\study\git_2016\12\p2>cd fun1
E:\study\git_2016\12\p2\fun1>echo bug_fix > hotfix.txt
E:\study\git_2016\12\p2\fun1>cd ..
E:\study\git_2016\12\p2>git branch
develop
* hotfix/bug_in_fun1
master
##添加一个修复说明
E:\study\git_2016\12\p2>echo fixed fun1 bug > release.0.0.2.md
##提交修复的版本
E:\study\git_2016\12\p2>git add .
E:\study\git_2016\12\p2>git commit -m "bug fixed in fun1"
##为修复的版本打一个标签
E:\study\git_2016\12\p2>git tag release-0.0.2 -a -m "fixed fun1 bug"
##推送至github,此时由于没有删除hotfix的分支,所以该分支也会被推送
E:\study\git_2016\12\p2>git push --all
...
* [new branch] hotfix/bug_in_fun1 -> hotfix/bug_in_fun1
##推送标签信息
E:\study\git_2016\12\p2>git push --tags
以上的操作就是修正一个release版本的操作。此时通过sourceTree查看一下就可以看到完整的提交流程。
github基于分支的协同开发总结:基于分支的远程协作可以让所有版本更加的清晰和方便跟踪,但是无疑会增加很多工作量,而如果是在团队内部开发是不是真的有必要使用分支管理需要团队根据自身的情况选择,而且分支管理的方式方法也很多,以上流程是基于gitflow的流程,不一定能够很好的适用于每个人的项目,所以具体该使用什么方法其实还是要团队内部进行统一。
网友评论