这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记
Git的正确使用姿势与最佳实践
前言---为什么要使用Git?
- 协同工作:目前业界绝大多数公司都是基于Git进行代码管理的,因此Git是必备技能
- 开源社区:目前绝大多数的开源项目都是基于Git维护的,参与这些项目的开发都需要使用Git
一、Git是什么
1.介绍版本控制的发展历史,为什么会出现Git?
- Git是一款为快速且高效地处理小工程到大工程而设计出来的免费且开源的分布式版本控制系统。
- 何谓版本控制? 版本控制是一种记录一个或若干文件的内容变化,以便来查阅特定版本修订情况的系统
- 为什么要使用版本控制? 在版本变动的时候,更好地关注变更,了解到每个版本的改动是什么,方便对改动的代码进行检查,预防事故的发生,也能够随时切换到不同的版本,回滚误删除的问题代码。
2.版本控制的代表性工具
| 版本控制类型 | 代表性工具 | 能够解决的问题 |
|---|---|---|
| 本地版本控制 | RCS | 本地代码的版本控制 |
| 集中式版本控制 | SVN | 提供一个远端服务器来维护代码版本,本地不保存代码版本,解决多人协作问题 |
| 分布式版本控制 | Git | 每个仓库都能记录版本历史,解决只有一个服务器保存版本的问题 |
①本地版本控制
- 基本原理:本地保存所有的补丁级,可以理解成就是所有的Diff,通过这些补丁,我们可以计算出每个版本的实际的文件内容。
- 缺点:RCS这种本地版本控制存在最致命的缺陷就是只能在本地使用,无法进行团队协作,因此使用的场景非常有限,因此衍生出了集中式版本控制。
②集中式版本控制
- 基本原理:(1)提供一个远端服务来保存文件,所有用户的提交都提交到该服务器中。(2)增量保存每次提交的Diff,如果提交的增量中和远端现存的文件存在冲突,则需要本地提前解决冲突。
- 优点:学习简单,更容易操作;支持二进制文件,对大文件的支持更友好。
- 缺点:(1)本地不存储版本管理的概念,所有提交都只能连上服务器后才可以提交。(2)分支上的支持不够友好,对于大型项目团队合作比较困难。(3)用户本地不保存所有版本的代码,如果服务端故障任意导致历史版本的丢失。
③分布式版本控制
- 基本原理:每个库都存有完整的提交历史,可以直接在本地进行代码提交;每次提交记录的都是完整的文件快照,而不是记录增量;通过push等操作来完成和远端代码的同步。
- 优点:分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体;分支管理功能强大,方便团队合作,多人协同开发;校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易导致代码丢失。
- 缺点:相对SVN更复杂,学习成本高;对大文件的支持不是特别好(git-lfs根据可以弥补这个功能)
2.介绍Git的发展历史
合作公司怀疑Linux团队对BitKeeper进行了逆向工程,BitKeeper不允许Linux团队继续无偿使用这个软件,因此Linus Torvald(Linux和Git的作者)决定自己开发一个分布式版本控制系统,他仅仅花了大概2 weeks就将Git开发了出来。
二、Git的基本使用方式
1.Git的基本命令介绍
常见问题: ①为什么配置了Git配置之后依然无法拉取代码?
- 免密认证没有配置
- Instead Of配置没有配,配的SSH免密配置,但是使用的还是HTTP协议访问
②为什么fetch了远端分支,但看本地当前的分支依然没有变化?
- Fetch会把代码拉取到本地的远端分支,但是并不会合并到当前分支,所以当前分支历史没有变化。
2.如何使用这些命令
①项目初始化
- mkdir study
- cd study
- git init
②其他参数
- --initial-branch 初始化的分支
- --bare 创建一个裸仓库(纯Git目录,没有工作目录)
- --template 可以通过模板来创建预先构建好的自定义git目录
③常见Git配置---用户名配置
- git config --global user.name "ouyangyi"
- git config --global user.email ouyangyi@bytedance.com
④常见Git配置---Instead of配置
- git config --global url.git@github.com:.insteadOf github.com/
⑤常见Git配置---Git别名配置
- git config --global alias.cin "commit --amend --no-edit"
⑥查看Remote
- git remote -v
⑦添加Remote
- git remote add origin_ssh git@github.com:git/git.git
- git remote add origin_http github.com/git/git.git
⑧免密配置:SSH可以通过公私钥的机制,将生成公钥存放在服务端,从而实现免密访问;目前的Key的类型有4种:dsa、rsa、ecdsa、ed25519
- 内存:git config --global credential.helper 'cache --timeout=3600'
- 硬盘:git config --global credential.helper 'store --file /path/to/credential-file',不指定目录的情况默认是~/.git-credentials
- 将密钥信息存在指定文件中 具体格式:{user}:${password}@github.com
三、Git研发流程
1.集中式工作流--Gerrit
①基本原理:
- 依托于Change ID概念,每个提交生成一个单独的代码评审
- 提交上去的代码不会存储在真正的refs/heads/下的分支中,而是存在一个refs/for/的引用下
- 通过refs/meta/config下的文件存储代码的配置,包括权限,评审等配置,每个Change都必须要完成Review后才能合入。 ②优点
- 提供强制的代码评审机制,保证代码的质量
- 提供丰富的权限功能,可以针对分支做细粒度的权限管控
- 保证master的历史整洁性
- Aosp多仓的场景支持更好 ③缺点
- 开发人员较多的情况下,更容易出现冲突
- 对于多分支的支持较差,想要区分多个版本的线上代码时,更容易出现问题
- 一般只有管理员才能创建仓库,比较难以在项目之间形成代码复用,比如类似的fork操作就不支持
2.分支工作流-GitFlow ①包含五种类型的分支
- Master:主干分支
- Develop:开发分支
- Feature:特性分支
- Release:发布分支
- Hotfix:热修复分支 ②优点
- 如果能按照定义的标准严格执行,代码会很清晰,并且很难出现混乱。 ③缺点
- 由于流程过于复杂,上线的节奏较慢,研发不容易按照标准执行,从而导致代码出现混乱。