这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记
1、为什么要学习Git
协同工作
业界绝大多数公司都是基于Git进行代码管理,因此Git是一个程序员的必备技能
开源社区
目前绝大多数的开源项目都是基于Git维护的,参与这些项目的开发都需要使用Git
2、Git是什么
Git is a free and open source distributed varsion control system designed to handle everthing from small to very large projects with speed and efficiency
3、版本控制
①本地版本控制
基本原理:本地保存所有变更的补丁集,可以理解成就是所有的Diff,通过这些补丁,我们可以计算出每个版本的实际的文件内容
缺点:RCS这种本地版本控制存在最致命的缺陷就是只能在本地使用,无法进行团队协作,因此使用的场景非常有限,因此衍生出了集中式版本控制
②集中版本控制
基本原理:
1)提供一个远端服务来保存文件,所有用户的提交都提交到该服务器中
2)增量保存每次提交的Diff,如果提交的增量中和远端现存的文件存在冲突,则需要本地提前解决冲突
优点:
1)学习简单,更容易操作
2)支持二进制文件,对大文件支持更友好
缺点:
1)本地不存储版本管理的概念,所有提交都只能联上服务器后才可以提交
2)分支上的支持不够好,对于大型项目团队合作比较困难
3)用户本地不保存所有版本的代码,如果服务器端故障容易导致历史版本的丢失
③分布式版本控制
基本原理:
1)每个库都有完整的提交历史,可以直接在本地进行代码提交
2)每次提交记录的都是完整的文件快照,而不是记录增量
3)通过Push等操作来完成和远端代码的同步
优点:
1)分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体
2)分支管理功能强大,方便团队合作,多人协同开发
3)校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易导致代码丢失
缺点:
1)相对SVN更复杂,学习成本更高
2)对于大文件的支持不是特别好(git-lfs工具可以弥补这个功能)
4、Git的基本使用方式
Git命令
配置:git config、git remote
提交代码:git add、git commit
远端同步:
①拉取代码:clone、pull、fetch
②推送代码:push
5、Git研发流程
常见的两种工作流:
①集中式工作流
只依托于master分支进行研发活动
工作方式:
1)获取远端master代码
2)直接在master分支完成修改
3)提交前拉取最新的master代码和本地代码进行合并(使用rebase),如果有冲突需要解决冲突
4)提交代码到master
基本原理:
1)依托于Change ID概念,每个提交生成一个单独的代码评审
2)提交上去的代码不会存储在真正的refs/heads/下的分支中,而是存在一个refs/for/的引用下
3)通过refs/meta/config下的文件存储代码的配置,包括权限,评审等配置,每个Change都必须要完成Review后才能合入
优点:
1)提供强制的代码评审机制,保证代码的质量
2)提供更丰富的权限功能,可以针对分支做细粒度的权限管控
3)保证master的历史整洁性
4)Aosp多仓的场景支持更好
缺点:
1)开发人员较多的情况下,更容易出现冲突
2)对于多分支的支持较差,想要区分多个版本的线上代码时,更容易出现问题
3)一般只有管理员才能创建仓库,比较难以在项目之间形成代码复用,比如类似的fork操作就不支持
②分支管理工作流
1)Git Flow
特点:分支类型丰富,规范严格
2)Github Flow
特点:只有主干分支和开发分支,规则简单
3)Gitlab Flow
特点:在主干分支和开发分支上构建环境分支,版本分支,满足不同发布or环境的需要