Git的优点
- 协同工作:代码管理
- 开源社区:开源项目开发维护
Git是什么
Git是一种版本控制系统,即一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 可以更好的关注版本变更内容,方便对改动的代码进行检查,也可以随时切换不同版本,回滚误删误改的问题代码。
本地版本控制
- 代表工具:RCS
- 基本原理:本地保存所有变更的补丁集,可以理解成就是所有的Diff,通过这些补丁,我们可以计算出每个版本实际的文件内容。
- 缺点:RCS这种文件版本控制最致命的缺陷就是只能在本地使用,无法进行团队协作。因此使用的场景非常有限,由此衍生出集中式版本控制。
集中式版本控制
- 代表工具:SVN
- 基本原理:
- 提供一个远端服务来保存文件,所有用户的提交都提交到该服务器中
- 增量保存每次提交的Diff,如果提交的增量中和远端现存的文件存在冲突,则需要本地提前解决冲突
- 优点:学习简单,容易操作;支持二进制文件,对大文件支持更友好
- 缺点:只能连上服务器才可以提交版本;分支上的支持不够好,大型团队合作困难;服务器故障可能导致历史版本丢失
分布式版本控制
- 代表工具:Git
- 基本原理:
- 每个库都存有完整的提交历史,可以直接在本地进行代码提交
- 每次提交记录的都是完整的文件快照,而不是记录增量
- 通过Push等操作来完成和远端代码的同步
- 优点:
- 分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体
- 分支管理功能强大,方便团队合作,多人协同开发
- 校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易导致代码丢失
- 缺点:
- 学习成本高
- 对于大文件的支持不是特别好(git-lfs工具可弥补)
Git 基本使用方式
Git目录介绍
- 项目初始化:mkdir study、cd study、git init
- 其他参数:initial branch 初始化分支、bare 创建一个裸仓库(纯Git目录、没有工作目录)、template 可以通过模板来创建预先构建好的自定义git目录
Git Config
每个级别的配置可能重复,但是低级别配置会覆盖高级别的配置。
常见Git配置
- 用户名配置:git config --global user.name 'xxx'
- Instead of配置:git config --global url.git@github.com:.instaldOf github.com/
- Git命令别名配置:git config --global alias.cin "conmmit --amend --no-edit"
Git Remote
- 查看Remote:git remote -v
- 添加Remote:git remote add origin_ssh git@github.com:git/git.git
- 同一个Origin设置不同的Push和Fetch URL:git remote set-url --add --push origin git@github.com:my_repo/git.git
HTTP Remote
免密配置分为内存配置和硬盘配置,相对安全。
SSH Remote
免密配置可以通过公私钥的机制,将生成公钥存放在服务端,从而实现免密访问。默认使用的key类型是rsa,优先推荐使用ed25519。
Git Add
将文件添加到暂存区。
Git Commit
将文件从暂存区添加到本地仓库中。
Objects
commit/tree/blob在git里面都统一称为Object,除此之外还有个tag的object。
- blob:存储文件的内容
- tree:存储文件的目录信息
- commit:存储提交信息,一个commit可以对应唯一版本的代码
流程
- 通过Commit寻找到Tree信息,每个Commit都会存储对应的Tree ID。
- 通过Tree存储的信息,获取到对应的目录树信息。
- 从Tree中获得Blob的ID,通过Blob ID获取对应的文件内容。
Refs
Refs文件存储的内容
refs的内容就是对应的Commit ID,因此把ref当作指针,指向对应Commit来表示当前Ref对应的版本。
Annotation Tag
附注标签,可以给标签提供一些额外的信息。
追溯历史版本
- 通过Ref指向的Commit可以获取唯一的代码版本。
- Commit里面会存有parent commit字段,通过commit的串联获取历史版本代码。
修改历史版本
- commit --amend:可以修改最近的一次commit信息,修改后commit id会变。
- rebase:通过git rebase -i HEAD~3可以实现对最近三个commit的修改
- filter --branch:可以指定删除所有提交中的某个文件或者全局修改邮箱地址等操作
Git GC
通过git gc命令,可以删除一些不需要的object。以及对object进行一些打包压缩来减少不必要的体积。
Git Clone & Pull & Fetch
- Clone:拉取完整的仓库到本地目录
- Fetch:将远端某些分支最新代码拉取到本地
- Pull:拉取远端某分支,并和本地代码进行合并
Git Push
Push是将本地代码同步至远端的方式。
Git研发流程
集中式工作流
- 特点:只依托于master分支进行研发活动。
- 代表工具:Gerrit
分支管理工作流
- 优点:提供强制的代码评审机制,保证代码的质量;权限丰富;
- 缺点:开发人员较多容易冲突;对于多分支的支持较差。
- 代表工具:GitFlow、Github Flow、Gitlab Flow
代码合并
Fast-forward和Three-Way merge。
如何选择合适的工作流
针对小型团队合作:可以使用Github工作流(少量多次)。