关于git的使用上深究的话是有不少疑惑点的,因此写篇文章记录下。git
以下图,是经常使用的git工做策略,网上基本都在说这一套的了。bash
主要的概念就是,有feature的时候就在develop上拉一条独立branch出来作,一条branch对应一个feature,作完之后在merge/rebase进去develop,要发布版本的时候在从develop里面抽出来到release branches ( 这部分有的团队不同,他们会先把develop稳定的版本抽到master而后发布的时候是从master中拉取 )。服务器
总体概念是很简单的,也有不少辅助工具(例如sourcetree就自带有git flow工具,推荐使用)去帮忙实现这个策略。可是带新人的时候他们总会遇到相似的问题,主要是GIT用得不熟悉。工具
1) master新增一个初始文件1.txt,而后push到remote测试
2) 成功push之后,新增branch -> developspa
git checkout -b develop
当前的分支状态就是一个小点点,为了看得更清楚些,会在develop进行一次推动:增长一个2.txt文件,并在1.txt文件中增长一行内容。code
3) 新增feature
如今要开发一个新的需求,咱们先基于develop拉一条branch开发
git checkout -b feature/1
而后在1.txt 随便加点东西,目前 1.txt的内容以下:rem
master - Hello World develop - My Baby feature/1 - Test
commit源码
4) 新增第二条feature
为了模仿协同开发,咱们基于develop分支从新拉一份源码,而后新增第二条branch: feature/2。一样修改一下 1.txt :
master - Hello World develop - My Baby feature/2 - Test2
由于两条feature都是基于develop,而且都没有push,因此feature2看不到feature1的内容
5) feature1,2都完成开发,各自commit和push之后
能够看到如今开始出现了分叉,这个时候咱们须要在develop branch整理一个版本发布到测试服务器上测试了,分别把两条branch rebase到develop上。
5.1) 先rebase feature/1
疑惑点:谁rebase谁?
这个是带新人的时候常被问到的问题,咱们的原则是用分支较后的rebase到较前的分支上,能够看到咱们的develop是在feature/1后面的,因此是在develop的分支上而后对feature/2进行rebase。
develop成功走到feature/1的节点上了,没有冲突,而后要rebase feature/2 ,一样是在develop上去rebase feature/2。能够预料的是,由于两个feature都改了同一个文件,因此必然会有冲突要处理。
master - Hello World develop - My Baby <<<<<<< HEAD feature/2 - Test2 ======= feature/1 - Test >>>>>>> feature/1 done
把1.txt修改为以下:
master - Hello World develop - My Baby feature/2 - Test2 feature/1 - Test
而后add一下1.txt,用git status查看一下当前状态:
mac002:gittest sevens$ git status rebase in progress; onto 87e2b10 You are currently rebasing branch 'develop' on '87e2b10'. (all conflicts fixed: run "git rebase --continue") Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: 1.txt
文件修改好了,再用下面命令继续rebase:
mac002:gittest chensh$ git rebase --continue Applying: feature/1 done
成功合并两条feature分支
如上图,蓝色是咱们的develop分支,能够看到feature/1和feature/2的代码都已经成功合并到develop分支上,而后push到remote就能够了。
疑问点:为何图上feature/1的分支感受没有合到develop上?
其实这就是rebase和merge的分别,咱们能够回到feature/1,来对develop进行一次merge看看效果:
一样会有冲突要处理,解决完冲突之后,commit一下,获得以下分支图:
合并以后feature/1是在develop的以前。
因此咱们能够看到rebase和merge的区别,rebase是把分支的内容合并到目标分支上,而自己的分支是不会合并到目标分支上的,所以rebase了之后,咱们是能够直接把分支delete掉的。而merge就是把整个分支合并到目标分支身上。
6) 发布测试版本
这个时候,为了更清晰,咱们能够在当前节点上增长一个tag来纪录当前的版本:
就能够提取出来上测试服了
7) 发布生产版本
回到咱们的gitflow图上,咱们要须要一条branch 叫release,因为是第一个版本,因此直接基于当前develop节点新增分支就行。