字节跳动青训营系列文章
同时这也是课表的第9天课程《Git的正确使用姿势与最佳实践》。PC端阅读效果更佳,点击文末:阅读原文即可。
官网介绍:
Git 是一个免费和开源的分布式版本控制系统,旨在以速度和效率处理从小型到大型项目的所有内容。
Git易于学习, 占用空间小,性能快如闪电。它优于 SCM 工具,如 Subversion、CVS、Perforce 和 ClearCase,具有廉价的本地分支、方便的暂存区域和 多个工作流等功能。
工作上用的比较多的就是Git了,像Git衍生出的Github,Gitee,Gitlab等等,当然也有其他的公司用Svn。
方向 | 具体能力 |
---|---|
代码托管 | 负责管理公司内数十万的代码仓库,并在这之上对代码管理的相关功能进行迭代,提升研发活动的效率及质量 |
代码智能 | 提供更准确高效的代码搜索能力和代码导航能力,支持多种场景下的代码跳转,帮助用户更高效的去阅读代码 |
代码分析 | 提供一种代码检查能力,目的是在整个研发流程中自动的发现并反馈代码中存在的代码结构、代码漏洞、代码风格等问题 |
持续集成 | 一种软件开发实践,团队成员频繁将他们的工作成果集成在一起。每次提交后,自动触发运行一次包含自动化验证集的构建任务,以便能尽早发现集成问题 |
Cloud IDE | 一个开箱即用的云端开发环境,支持node/python/go/java/c++等多种编程语言。可以在云端开发环境中编写、编译、运行和调试项目 |
协同工作:业界绝大多数公司都是基于Git进行代码管理,因此Git是一个程序员的必备技能
开源社区:目前绝大多数的开源项目都是基于Git维护的,参与这些项目的开发都需要使用Git。
常见问题
课程目标
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,通过这些补J,我们可以计算出每个版本的实际的文件内容
缺点:RCS这种本地版本控制存在最致命的缺陷就是只能在本地使用,无法进行团队协作,因此使用的场景非常有限,因 此衍生出了集中式版本控制
优点:
缺点:
基本原理:
优点:
缺点:
作者 Linus Torvalds(就是Linux这个项目的作者,同时也是Git的作者)。
开发原因:怀疑Linux团队对BitKeeper (另一种分布式版本控制系统,专有软件)进行了逆向工程,BitKeeper 不允许Linux团队 继续无偿使用。因此决定自己开发一个分布式版本控制系统。
开发时间:大概花了两周时间,就完成了Git的代码第一个版本,后续Linux项目就开始使用Git进行维护。
Github:https://github.com
Gitlab:https://gitlab.com/gitlab-org
Gerrit:https://android-review.googlesource.com/
随着 Git 的发展,基于 Git 也衍生出了很多平台。除此之外,还有 BitBucket, Coding, 码云,阿里云效平台等等,每个平台都有自己的使用场景和优势。
项目初始化
mkdir study
cd study
git init
其他参数
--initial-branch 初始化的分支
--bare 创建一个裸仓库(纯Git目录,没有工作目录)
--template 可以通过模版来创建预先构建好的自定义git目录
在这里我们要重点关心一下这个 git 目录,因为我们后续每一个 git 操作都会映射到这个 git 目录之中,通过这里面的文件我们可以映射出所有版本的代码
Git仓库 | 工作区&暂存区 |
---|---|
我们刚刚看到 git 目录里面有个 config 文件,那这个 git 配置到底是个什么东西呢,我们又可以配置哪些内容呢,我们一起来了解一下 Git 配置这个概念
每个级别的配置可能重复,但是低级别的配置会覆盖高级别的配置
用户名配置
// 对当前用户的所有仓库有效
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
git config命令查看用户名,邮箱
git config user.name
git config user.email
查看Remote
git remote -v
添加Remote
git remote add origin_ssh git@github.com.git/git.git
git remote add origin_http https://github.com/git/git.git
URL: https://github.com/git/git.git
(引出免密配置)我们本地是如何与 remote 进行通信的呢,一般会通过 http 和 ssh 两种协议,这两种协议都需要对身份进行认证,类似 go 这种语言,依赖库很多,所以我们需要不断的输入认证的账号密码,肯定是一件很麻烦的事情,因此我们需要配置一下免密的认证方式
除了 objects 文件有变化,我们发现 refs 的文件内容也有变化
Branch
Tag
获取当前版本代码
获取历史版本代码
通过这个命令可以修改最近的一次commit信息,修改之后commit id会变
通过git rebase -i HEAD~3可以实现对最近三个commit的修改
该命令可以指定删除所有提交中的某个文件或者全局修改邮箱地址等操作
GC
Reflog
指定时间
完整的Git视图
Clone
Fetch
Pull
Push是将本地代码同步至远端的方式。
常用命令
一般使用git push origin master命令即可完成 冲突问题
推送规则限制
02. 常见问题
常见问题
什么是集中式工作流?
工作方式
Gerrit是由Google开发的一款代码托管平台,主要的特点就是能够很好的进行代码评审。
在aosp (android open source project)中使用的很广,Gerrit 的开发流程就是一种集中式工作流。
基本原理
优点
缺点
分支管理工作流 | 特点 |
---|---|
Git Flow | 分支类型丰富,规范严格 |
Github Flow | 只有主干分支和开发分支,规则简单 |
Gitlab Flow | 在主干分支和开发分支之上构建环境分支,版本分支,满足不同发布or环境的需要 |
Git Flow时比较早期出现的分支管理策略。
包含五种类型的分支
优点如果能按照定义的标准严格执行,代码会很清晰,并且很难出现混乱。
缺点流程过于复杂,上线的节奏 会比较慢。由于太复杂,研发容易不按照标准执行,从而导致代码出现混乱。
Github的工作流,只有一个主干分支,基于Pull Request往主干分支中提交代码。
选择团队合作的方式
创建一个Pull Request
可以在Pull Request页面执行CI/CA/CR等操作,都检查通过后,执行合入。
可以通过进行一些保护分支设置,来限制合入的策略,以及限制直接的push操作。 |
Gitlab推荐的工作流是在GitFlow和Github Flow 上做出优化,既保持了单一主分支的简便, 又可以适应不同的开发环境。
原则: upstream first上游优先
只有在上游分支采纳的代码才可以进入到下游分支,一般上游分支就是master.
Fast-Forward
不会产生一个merge节点,合并后保持一个线性历史, 如果target分支有了更新,则需要通过rebase操作更新source branch后才可以合入。
Three-Way Merge:三方合并,会产生一个新的merge节点
选择原则:没有最好的,只有最合适的
针对小型团队合作,推荐使用Github工作流即可
大型团队合作,根据自己的需要指定不同的工作流,不需要局限在某种流程中。
常见问题
总结:
课程内容 Git 是一个分布式版本控制工具,由 linus 开发,衍生出 github gitlab gerrit 等平台 Git 配置,Git 代码提交,Git 代码同步基本命令,以及 git 管理代码的原理;帮助我们更好的知道如何正确使用 Git 命令 讲述不同的研发流程,有以 gerrit 为代表的集中式工作流,和 gitlab/github 为代表的分支管理工作流,讲述了一些代码提交规范,保护分支,codereview 等概念,帮助我们规范研发流程 。