Git相关 | 青训营笔记

87 阅读4分钟

版本控制

Git是什么
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency

版本控制是什么?
一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统

为什么需要版本控制?
更好的关注变更,了解到每个版本的改动是什么,方便对改动的代码进行检查,预防事故发生; 也能够随时切换到不同的版本,回滚误删误改的问题代码;

版本控制类型 代表性工具 解决的问题
本地版本控制 RCS 本地代码的版本控制
集中式版本控制 SVN 提供一个远端服务器来维护代码版本,本地不保存代码版本, 解决多人协作问题
分布式版本控制 Git 每个仓库都能记录版本历史,解决只有一个服务器保存版本的 问题

本地版本控制

最初的方式
通过本地复制文件夹,来完成版本控制,一般可以通过不同的文件名来区分版本

解决方案
开发了一些本地的版本控制软件,其中最流行的是 RCS

基本原理
本地保存所有变更的补丁集,可以理解成就是所有的 Diff,通过这些补丁,我们可以计算出每个版本的实际的文件内容

缺点
RCS 这种本地版本控制存在最致命的缺陷就是只能在本地使用,无法进行团队协作,因此使用的场景非常有限,因此衍生出了集中式版本控制

集中版本控制

代表性工具: SVN
基本原理:

  1. 提供一个远端服务来保存文件,所有用户的提交都提交到该服务器中
  2. 增量保存每次提交的 Diff,如果提交的增量中和远端现存的文件存在冲突,则需要本地提前解决冲突

优点:

  1. 学习简单,更容易操作
  2. 支持二进制文件,对大文件支持更友好

缺点:

  1. 本地不存储版本管理的概念,所有提交都只能联上服务器后才可以提交
  2. 分支上的支持不够好,对于大型项目团队合作比较困难
  3. 用户本地不保存所有版本的代码,如果服务端故障容易导致历史版本的丢失。

分布式版本控制

代表性工具: Git
基本原理:

  1. 每个库都存有完整的提交历史,可以直接在本地进行代码提交
  2. 每次提交记录的都是完整的文件快照,而不是记录增量
  3. 通过 Push 等操作来完成和远端代码的同步

优点:

  1. 分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体
  2. 分支管理功能强大,方便团队合作,多人协同开发
  3. 校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易导致代码丢失

缺点:

  1. 相对 SVN 更复杂,学习成本更高
  2. 对于大文件的支持不是特别好 (git-lfs 工具可以弥补这个功能)

Git 目录介绍

项目初始化
mkdir study
cd study
git init
其他参数
--initial-branch 初始化的分支
--bare 创建一个裸仓库 (纯 Git 目录,没有工作目录)
--template 可以通过模版来创建预先构建好的自定义 git 目录

不同的工作流

类型 代表平台 特点 合入方式
集中式工作流 Gerrit / SVN 只依托于主干分支进行开发,不存在其他分支 Fast-forward
分支管理工作流 Github / Gitlab 可以定义不同特性的开发分支,上线分支,在开 发分支完成开发后再通过 MR/PR 合入主干分支 自定义,Fast-Forward or Three-Way Merge 都可以

集中式工作流

什么是集中式工作流?
只依托于 master 分支进行研发活动
工作方式

  1. 获取远端 master 代码
  2. 直接在 master 分支完成修改
  3. 提交前拉取最新的 master 代码和本地代码进行合 并 (使用 rebase),如果有冲突需要解决冲突
  4. 提交本地代码到 master

集中式工作流-Gerrit

优点

  1. 提供强制的代码评审机制,保证代码的质量
  2. 提供更丰富的权限功能,可以针对分支做细粒度的权限管控
  3. 保证 master 的历史整洁性
  4. Aosp 多仓的场景支持更好

缺点

  1. 开发人员较多的情况下,更容易出现冲突
  2. 对于多分支的支持较差,想要区分多个版本的线上代码时,更容易出现问题
  3. 一般只有管理员才能创建仓库,比较难以在项目之间形成代码复用,比如类似的 fork 操作就不支持。

分支管理工作流

分支管理工作流 特点
Git Flow 分支类型丰富,规范严格
Github Flow 只有主干分支和开发分支,规则简单
Gitlab Flow 在主干分支和开发分支之上构建环境分支,版本分支,满足不同发布 or 环境的需要