前言
本教程针对实战操作,一切内容从实操角度出发,对底层命令的使用和过深的概念不作阐述。本教程主要基于TortoiseGit等图形界面工具的使用进行讲解,但是操作是互通的,理解了概念后换成任一工具都可以。建议在了解应用层面后也了解一下Git的底层操作,可参考Git经典教程《Git教程——廖雪峰的官方网站》。
什么是Git
一个版本控制系统,特点是免费、开源、高效、分布式。
Git与SVN
- Git相对SVN的优点
Git的优势在于能够非常灵活的基于指针创建分支,提高项目版本的灵活性。SVN是基于文件复制创建分支,导致分支功能效率低下、非常鸡肋,所以SVN的开发操作一般都在主线上,版本管理相对限制。 - SVN相对Git的优点
SVN天生就是集中式版本管理系统,对权限控制的支持达到极致,可以根据项目组要求进行文件级别的各种权限限制;Git倡导的是开源精神,所以Git对权限管理的支持不高,虽然可以通过例如GitLab等服务配置权限,但也只能配置控制到分支级别。
Git的重要概念
Git的分布式与集中式
Git是基于分布式的版本管理系统,主要的思想是去中心化,意思是所有的机子都可以成为远程仓库,理论上是每个人都可以从最近的机子获取代码。但是Git的实际应用中主要还是基于集中式进行,通常会有一台服务器作为远程仓库,项目组的开发成员会从这个远程仓库上获取代码,而最后也是提交代码到这个远程仓库。Git的本地仓库与远程仓库
Git中会有本地仓库和远程仓库的概念,在这里我们简单的把本地仓库当作开发者的本地Git,而远程仓库就是上边提到的集中式的中心仓库,本地仓库要向远程仓库提交代码时是通过push操作实现的。
补充:为什么只能是本地仓库向远程仓库(此处特指中心仓库)push,而不能反过来?Git是分布式的,理论上每个仓库都是平等一致的,中心仓库其实也是一个普通仓库。假设仓库A向另一个仓库B push文件时,建立的连接是基于ssh的,那么前提就要求仓库B必须保存了仓库A的SSH key,也就是仓库A要先创建SSH key,然后把SSH Key告诉了仓库B,在仓库B保存了仓库A的SSH key后A仓库才有权限把文件push到仓库B,基于这个原理我们就能够轻易的实现集中式的Git。Git的分支
Git的最强大之处就是以分支为主导的开发模式,本教程中是比较精简的模型,远程仓库主要有master和dev两条分支,为了实现热修复还有一条hotfix分支。开发的时候开发者需要习惯为每个开发任务分别创建分支,在新的分支上进行功能开发,开发完成后再合并到远程分支。
Master和Developer角色
本例中设定的角色只有Master和Developer角色。一般开发者都是Developer角色,拥有对dev、hotfix分支的所有权限,但不能操作master分支;而能够拥有版本发布权限的开发者则是Master角色,除了拥有dev分支的所有权限外,还拥有master分支的所有权限。
Git的常用功能
clone
从远程仓库下载项目到本地pull
更新本地文件create branch
创建分支switch/checkout
切换分支commit
修改内容提交到分支push
把分支内容提交到远程仓库merge
合并从其他分支push过来的内容stash save
保存当前工作快照stash pop
恢复工作快照
分支模型
分支模型的设计可参考《Git实战教程[附录一]——分支模型设计》