Gitflow 工作流
Gitflow 工作流,扩展了集中式工作流与功能分支工作流。
Gitflow 是 Vincent Driessen 在他的博客 nvie 上介绍的一种 Git 工作流程。
开发分支
在开发中使用 Gitlfow 工作流。开发者们都要在本地创建一个开发分支,一般叫 develop。开发者创建的功能分支(feature branch)要基于这个开发分支(develop),功能分支完成以后,要合并到这个开发分支上。也就是这个 develop 记录了项目的开发历史。
功能分支
开发者要为项目添加新功能,就在自己本地创建功能分支。一般分支可以使用 feature-
作为分支名的前缀。方法跟功能分支工作流里介绍的一样,只不过在 Gitflow 工作流里,功能分支要基于 develop 分支创建,并且最终要合并到 develop 分支上。
发行分支
项目开发的差不多了,就可以去准备一个发行分支,一般用 release-
作为前缀。在发行分支上不添加新功能了,只修复 bug ,还有为项目发行做准备。准备好以后,把发行分支全并到主分支(master)上,然后打个标签(tag),比如 v1.1,v1.2 之类的。
维护分支
突然发现有需要立即解决的问题,可以创建 hotfix 分支,这个分支你可以直接基于 master 分支创建。然后修复问题,再把 hotfix 分支合并到 master 与 develop 分支上。
练习
走一遍使用 Gitflow 的开发流程。还是继续用之前我们一起开发的项目,项目的开发者有两个人,王皓(wanghao8080),他是项目的发起人,还有另外一个开发者叫小雪(xiaoxue8080)。
创建开发分支
项目的发起人在最初创建项目的时候,就应该去创建一个开发分支(develop),然后把这个分支也推送到项目的远程,这样项目的协作开发者在克隆项目到本地的时候,也都可以有一个 develop 分支。
现在我们才决定要使用 Gitflow 的流程去开发,所以可以先去创建一个 develop 分支。这个任务让项目的发起人去做,王皓进入到了他的项目所在的目录 test-git,然后执行了:
git branch develop
git push origin develop
创建了一个 develop 分支,又把这个分支推送到了远程 。平时工作的时候,创建的功能分支都应该基于 develop 分支,可以把当前分支切换到 develop :
git checkout develop
小雪之前已经克隆了仓库,她做这件事儿的时候,远程那里还没有 develop 分支。她进入到了在本地存储的项目目录(xiaoxue-git),然后执行了一下:
git fetch
然后再执行:
git checkout -b develop origin/develop
现在小雪的本地也有了 develop 分开。
小雪有了新任务
现在小雪有了新任务或者新的想法,她想去试一下。可以先去创建一个功能分支,方法与流程在功能分支工作流里介绍到了,不太一样的是,Gitflow 里面, 功能分支要基于 develop 分支创建。其它的跟功能分支工作流差不多,创建新的功能分支,修改项目,提交,推送到远程,完成了功能以后可以发起一个 pull request ,大家讨论以后可以把功能分支合并到 develop 分支上。
小雪要去写一个关于介绍 Git 远程仓库的文档,她先去创建了一个分支:
git checkout -b remote-doc develop
接着创建了一个 Markdown 文档:
touch remote.md
做了一次提交:
git add .
git commit -m '添加介绍远程仓库的文档'
又这样修改了一下 remote.md:
# 远程
Remote,指的是项目的远程仓库。
又做了一次提交:
git commit -am '添加介绍远程仓库的内容'
小雪完成了任务
小雪觉得文档已经写完了,她可以把功能分支 push 到远程,然后发起 pull request,或者也可以直接把功能分支合并到 develop 分支。
她先看看远程的 develop 有啥新东西没:
git pull origin develop
切换到 develop:
git checkout develop
把 remote-doc 这个功能分支合并到 develop:
git merge remote-doc
把合并之后的 develop 推送到远程:
git push origin develop
现在,功能分支可以删除掉了:
git branch -d remote-doc
准备发行
这个项目做的差不多了,可以准备一次正式的发行。这个任务还是小雪去做,她先要去创建一个为发行准备的发行分支,分支名一般可以使用 release- 作为前缀。执行:
git checkout -b release-0.1 develop
她把发行分支推送到了项目的中央远程仓库:
git push origin release-0.1
本次发行任务的小组成员里还有王皓,他可以往这个发行分支里做自己的提交。新功能不要放到发行分支了,你可以留着下一次发行用,发行分支主要就是为项目的发行做准备,比如修复 bug 之类的。
小雪要去做一点修改,打开 remote.md,在文档里添加一个笑脸符号:
# 远程 :)
Remote,指的是项目的远程仓库。
做一次提交:
git commit -am '在远程文档里添加笑脸符号'
Push:
git push origin release-0.1
完成发行
大家共同的努力,项目现在已经可以正式发行了。这件事还是小雪去做:
git checkout master
git merge release-0.1
git push
git checkout develop
git merge release-0.1
git push
git branch -d release-0.1
完整版过程:
→ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
→ git merge release-0.1
Merge made by the 'recursive' strategy.
remote.md | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 remote.md
→ git push
Counting objects: 2, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 293 bytes | 0 bytes/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/xnip/test-git.git
5ba8a81..9d19981 master -> master
→ git checkout develop
Switched to branch 'develop'
Your branch is up-to-date with 'origin/develop'.
→ git merge release-0.1
Updating 53c71aa..20e1feb
Fast-forward
remote.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
→ git push
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/xnip/test-git.git
53c71aa..20e1feb develop -> develop
→ git branch -d release-0.1
Deleted branch release-0.1 (was 20e1feb).
给这次发行打个标签:
git checkout master
git tag -a v0.1 -m '项目的首次发行'
git push --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 183 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To https://github.com/xnip/test-git.git
* [new tag] v0.1 -> v0.1
发现 Bug
哦 ~ 发现一个 Bug,要马上修复。
git checkout -b issue-#001 master
修复 Bug 需要在 repository.md 里添加一个笑脸:
# 仓库 :)
Repository,仓库,简称 Repo。
提交:
git commit -am '修复了 issue-#001'
把修复合并到 master:
git checkout master
git merge issue-#001
git push
这个修复也需要合并到 develop:
git checkout develop
git merge issue-#001
git push
完成以后就可以删除掉修复 bug 用的这个分支了:
git branch -d issue-#001
~ 戏剧的一天结束了,下班 ~