git分支进阶

730 查看

其实git除了版本控制,另外一个最突出的特点就是他的分支操作。简直 丝滑~.git也是多人协作的必备武器。 通常我们正常情况下只需要master 和 develop分支就够了。 这里我们先以这两条分支作为基准,进行一系列的操作。

开发新功能流程

这个应该属于develop分支的所有(Master分支只管稳定版). 第一步,应该创建develop分支。

git checkout -b develop

然后拷贝主分支上的内容

git rebase master

(  ̄3)(ε ̄ ), ok, 正常情况下,你的develop分支和master上的分支就一模一样了。 但是有的童鞋会有疑问,特么你为什么不用merge呢?
我就不用~ 就不用~ 就不用~
(づ ̄ 3 ̄)づ , 其实使用merge和使用rebase的区别就是,(使用mege是终极合并分支,使用的是fast-forward的模式,造成两个分支的同步,给你开发新功能造成不必要的麻烦,当然,你可以使用. git merge --no-ff master合并,就可以啦。而你如果使用这个方式的话,会造成你图谱git出现不必要的复杂度。。。而使用rebase会改变的你分支的基底~ 这样看起来舒服一点。。。)
不懂诶~ ~ ~ ::>_<::
没事,上面括号里面知识参考的,你不看根本没关系。 如果你感 性 趣的话,可以参考英文rebase讲解 | | 中文rebase讲解
所以这里我就不赘述了,继续
这时候我们就要在develop分支上开发新分支了。
现在假设我们已经做了一些改动(可能已经过去两天了).
这时候我们要把develop分支提交到远端,但在提交之前需要再同步一下master分支(为什么? 你猜~ 你也可以不同步,反正下次拉下来再同步的时候难受的是你自己)。接着使用:

git fetch origin master
git rebase master

Ok~ 如果没出什么conflict那么恭喜你,你已经学会了同步分支的流程。
另外,rebase还有一个iteractive模式,其实就是用来处理在你开发时别人提交的commit 和相关的-m参数. 这里我们不做要求,因为好麻烦, 笨宝宝不想说 (~﹃~)~zZ。
如果感兴趣的同学可以参考: 传送门
OK,最后当你develop分支开发完毕,这时候你需要切换到master分支上去合并。

git checkout master
git merge --no-ff develop

OK,如果没有conflict恭喜,已经成功.
恩,说道这里,两个分支的开发git已经基本完毕了。
(┬_┬),为什么两个分支开发起来都这么复杂。
小朋友,你知道在一些团队,他们用的是5个分支吗?
主要分支: master,develop
辅助分支: hotfix,feature,release
这里我们来介绍一个git的语法糖~git flow

git flow的开发流程

这个应该是集各种糖之大成,然你免去创建分支,删除分支,切换分支,打标签等等各种烦恼,以及...自行google
这里我只讲干货诶。
先按惯例上张图:

这个是gitflow的鼻祖做的讲解图。 看不懂吧,我一开始也看不懂,后面写写的就懂了。
我先按分支说一下他们各自的功能吧:

主要分支:

1. master: 稳定发布版(永远隐藏)
2. develop: 持续更新版(永远工作)

辅助分支:


1.feature: 同步develop开发新功能,完成后与develop合并(merge)
2. release: 当新功能版本开发完后,就可以使用release分支进行创建分支并且合并,修完bug之后,与develop和master分支进行合并
3. hotfix: 这个应该算是紧急情况吧,当线上出问题的时候,需要马上进行修复,然后再提交。 完成后,会与develop和master分支进行合并.

ok , 基本上,说了各自分支的一些基本用处。 现在我们来正式介入git flow这个神奇的语法糖。
首先,我们要安装git-flow这个命令集合。
在MAC上,我们直接可以使用:

brew install git-flow; //安装

在windows上,可以使用:

wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | bash

直接复制贴到命令行就可以了。
git flow init
首先创建你的git 分支群,即上面说的那几个。 接下来,zsh || bash || cmd会弹出一个对话框.

像这样,闭着眼睛,一直点[Enter]就可以了。
接下来你会发现,你初始化的时候就是处在develop分支上面的.
Ok~ 正常的话,我们就可以开始进行功能的开发了。
使用git flow feature start [branchName]命令,建立你的功能分支, 之后你便可以创建一些特定功能.(他省去了,你创建分支,并rebase分支这一过程,超棒.~^_^~ )

git flow feature start headerBar

之后他会提示你一些信息,告诉你现在正在feature/headerBar分支上,然后你就可以进行一些开发...
当然,功能开发是一项长久的任务,以后你也需要不断的进行git rebase develop进行分支的更新,然后继续开发。 要知道gitflow只是一个语法糖,原生的git命令你完全都可以用的。
所以,你还可以将新建的功能分支保存到远端.

git flow feature publish feature/[branchName]
//或者使用原生的
git push origin feature/[branchName]

我倾向于用原生的...
完成开发之后一定要记着使用.git flow feature finish [branchName].
这里我们使用headerBar分支

git flow feature finish headerBar

Ok~ 它便会将你的分支与develop进行合并,然后并且删除该feature分支。 如果你不犯傻两边都改动(develop和feature分支), 应该不会出现conflict的。
满意~ #^_^#.
现在你的develop分支已经开发成熟了,想要发布一个测试版,这时候就可以使用git flow release start [tag]. 进行发布,记着打上标签(版本号). 还有,要保证这个release是你当前最稳定的版本才行。

git flow release start v0.0.1

棒~ 现在,你已经创建了一个release的0.0.1版。然后,你可以在release分支上进行最后的修改。
现在,准备工作已经基本做完,现在我要正式发布啦~~
怕拉吧~ ( ⊙ _ ⊙ )一般吧
使用git flow release finish [tag]后面跟上你创建release的指定版本号,这里我们接着使用v0.0.1

git flow release finish v0.0.1

Ok~这时候,release分支会和develop,master分支进行合并,然后被删除。 也就是,只有在release的时候,我们才能真正的接触到master分支。 这也是git-flow最让我感到震撼的, 完整的规范化,简直了~ 我爱 上它了。
还记得我们打的标记吗? 没错,他会保存在你的git仓库里。你可以使用git tag进行检查.
另外gitflow还有一个致命诱惑就是他的hotfix分支。简直啦~~~ 超级棒。
当你的master已经上线,但是突然出现一个bug的话,你可以直接在master分支上改动,但是有个问题就是,master的分支超前了develop分支,造成你版本的混乱。 所以,这里我们可以直接使用git flow hotfix start [tagName], 其中tagName是新建的一个分支,表示完成bugfix的版本号。

git flow hotfix start v0.0.2

现在,我们已经创建了一个分支hotfix/0.0.2, 而且他贴心的帮我们rebase了master内容,然后我们完成之后就可以使用git flow hotfix finish [tagName]进行hotfix的收尾工作。

git flow hotfix finish v0.0.2

OK, 然后贴心的zsh会给你一些提示信息,说明已经和master,develop分支合并,完成了bug的修复。棒~
所以,现在大多数team的都已经使用git-flow进行git的布局和管理,我们可以和如翔一般的分支管理说拜拜啦~ 虽然说是5大分支,但其实,我们的主要存在的分支依然只有develop和master分支~ 最后我们在一起回顾一下,git-flow的工作流程:

1. 创建分支: git flow init
2. 进行功能分支的开发: git flow feature start [branchName]
3. 进行功能的合并: git flow feature finish [branchName]
4. 进行发布版的准备: git flow release start [tagName]
5. 完成发布版: git flow release finish [tagName]
6. 热插拔修复bug: git flow hotfix start [tagName]
7. 完成hotfix: git flow hotfix finish [tagName]

OK~ 现在git-flow我们已经基本学会了。当然,git原本就好到无懈可击,加上git-flow的优化,简直,神一般的存在。 最后再搬一句我爱的idiom:

Blessing in disguise

前端路漫漫a ~