Git 的正确使用姿势与最佳实践 | 青训营笔记

114 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记


 引言

为什么要学习 Git ?

  • Git 在开源社区,协同工作中非常重要

为什么要安排这个课程 ?

  • 熟悉配置不同的git环境,从普通的git使用到学会自行排查解决git问题

Git 是什么

版本控制发展史

本地版本控制

  • 依托于本地磁盘进行版本控制
  • 为什么要版本控制:方便回滚以及检查改动的代码,预防事故发生
  • **RCS:**打打本地保存补丁集,通过补丁计算版本内容,缺点是只能在本地使用

集中式版本控制

  • 存在一个统一的远端服务器,用于版本控制,本地不存储版本控制
  • **SVN:**提供远端服务来保存文件,用户将版本提交到服务器中,增量保存提交的diff。有点是学习简单易操作,支持二进制文件。缺点是本地不存储版本管理的服务,所有提交都只能联上服务器后使用。分支支持差,大型团队合作困难。若服务器故障可能会导致版本丢失。

分布式版本控制

  • 每个库都拥有所有的版本控制信息,远端服务器用于不同库之间进行版本信息同步
  • git:每个库都有完整的提交历史。每次提交记录都是完整的文件操作,通过push完成与远端代码的同步,
  • 优点:分布式开发,每个库都是完整的提交历史,支持本地提交。分支管理完善。校验和机制保证完整性。
  • 缺点:更复杂,学习成本高。大文件支持性差 

衍生平台

除此之外,还有 bitbucket, Coding, 码云 等一系列平台

Git 命令基本使用方式和原理

Git 配置

  • Git Config

Git 配置,分成本地,用户,系统基本的配置

  • Git Remote

Git Remote 配置,分成 SSH 和 HTTP 两种协议实现,不同协议有不同的免密配置方式

代码提交

git分为工作区和暂存区。

  • Git Add

将代码从工作区提交到暂存区

  • Git Commit

将暂存区代码提交到 Git 存储

Git 存储基本概念

  • Ref

    • Tag 仓库标签
    • Branch 仓库分支
  • Object

    • Blob 存储文件内容信息
    • Tree 存储目录树信息
    • Commit 存储提交信息
    • Tag 存储附注标签信息

代码同步

  • Git Clone

将代码从远端拉取到本地

  • Git Fetch & Git Pull

将远端仓库代码同步到本地仓库

  • Git Push

将本地代码同步到远端仓库

Git 研发流程

如何合并代码

  • Three Way Merge

  • Fast Forward Merge

不同的工作流

  • 集中式工作流:gerrit/SVN 

只依托于主干分支进行开发,不存在其他分支。

优点:

  •  强制代码评审保证代码质量
  • 提供丰富的权限功能,可以针对分支做细致的权限管控。
  • 保证master的李致整洁
  • 多仓场景支持更好

缺点:

  • 开发人员较多的情况下,容易冲突。

  • 多分枝支持差。

  • 只有管理员才能创建仓库,难以在项目之间形成代码复用

  • _分支管理工作流:_Github/Gitlab

可以定义不同特性的开发分支,上线分支,在开发完成后再合入主干分支

  • Git Flow

包含五种分支,

优点:按标准执行代码很清晰,不易出现混乱

缺点:由于太过复杂,上线节奏很慢,不按标准执行的话会导致代码混乱。

  • Github Flow

只有一个主干分支,可自主指定合入策略

  • Gitlab Flow

既保持了单一主分支的简便,又可以适应不同的开发分支

选择合适的工作流

  • 少量多次提交

  • 保证 CR / CI 等流程通过后才可合入

  • 尽量保证主分支整洁

小型团队选择github即可。