大学两年里,接触了三种版本控制系统:
Git 关心的是文件数据的整体是否发生变化。而大多是版本控制器是关系文件修改前后的具体差异。也就是说,Git 的每一次 commit 都会保存一份所有被跟踪的文件的快照,然后保存一个指向这个快照的索引。当然,为了提高性能,对于没有修改的文件,只保存指向上一个版本的连接。
Git 的一个很特别之处是它是一个分布式版本控制系统。
分支是指你可以从开发主线上分离开来,在不影响开发主线的前提下进行新的功能、特性开发。
Git 的分支功能是我最喜欢的一个功能。刚从 SVN 的世界脱离到 Git 时,也许会不习惯,但你会喜欢上它的。
SVN (和大多数版本控制器)的世界里,基本没有分支功能。或者需要分支的时候,要么重新建立一个新的版本库,在同一个版本库里拷贝一个副本进行开发。这样实现分支显得有些不太舒服,对大项目来说创建分支的代价是巨大的。
Git 的世界里,分支的使用显得很频繁。(并且 Git 是鼓励使用分支和合并功能)在上文提及过 Git 通过记录文件的快照来保存每一次提交的版本。Git 中的分支,实际上就是指向提交对象的可变指针。所以在创建分支、分支切换、分支删除的时候都可以很快就执行完毕,Git 的分支管理代码非常之小。
良好的 Git 分支使用,能够极大程度的提高开发效率,下面介绍一种 Git 的分支模型。
有两个分支是整个开发过程都存在的:
关于这两个分支,有以下的说明:
另外还有 3 个支撑分支:
feature 分支用于开发新的特性。他从 develop 分支分离出来,并且当新特性开发完成后合并回 develop.
分支命名:feature-xxx
示范:
$ git checkout -b feature-xxx develop // finish develop new feature $ git checkout develop $ git merge --no-ff feature-xxx $ git branch -d feature-xxx $ git push origin develop
release 分支预发布状态的版本。release 分支下可以对代码进行小型的 bug 修复,以及做元数据的修改,如发布版本,发布时间等信息。
release 分支从 develop 分离出来,最终必须合并到 master 和 develop 分支。
分支命名:release-xxx
示范:
$ git checkout -b release-1.0 develop $ ./release-action.sh 1.0 $ git add ./ $ git commit -m "Release 1.0" $ git checkout master $ git merge --no-ff release-1.0 $ git tag -a 1.0 $ git checkout develop $ git merge --no-ff release-1.0 $ git branch -D release-1.0
hotfix 分支是在预备发布阶段对严重的 bug 进行修复的分支。
hotfix 分支从 __master__ 分离出来,最终必须合并到 __master__ 和 __develop__.
分支命名:hotfix-*
示范:
$ git checkout -b hotfix-1.0 master $ ./hotfix $ git commit -m "Hotfix" $ git checkout master $ git merge --no-ff hotfix-1.0 $ git checkout develop $ git merge --no-ff hotfix-1.0 $ git branch -D hotfix-1.0