字节跳动 Git 的正确使用姿势与最佳实践

版本控制Git 黑马&尚硅谷

Git的前世今生

方向介绍

为什么要学习Git

1.0 Git是什么

1.1 版本控制

1.1.1 本地版本控制

1.1.2 集中版本控制

1.1.3 分布式版本控制

我们已经把三个不同的版本控制系统介绍完了,Git 作为分布式版本控制工具

虽然目前来讲是最先进使用最广的,但是其实在最开始,他也不是第一个出现的分布式版本控制软件,

接下来我们就介绍一下 Git 的发展历史,以及现在市面上基于 Git 演进的各种平台

1.2 Git发展历史

由于 bitkeeper 不是开源的,所以一开始其实 linux 团队的人就很排斥使用该软件

BitKeeper 是一个专有软件,由于 Linux 项目的一个开发人员,写了一个工具 去连接 BitKeeper, 因此被怀疑是对 Bitkeeper 做了逆向工程

因此这个公司就不允许 Linux 团队继续使用;有兴趣的可以可以自己去看 Git 的最早的代码历史

随着 Git 的发展,基于 Git 也衍生出了很多平台 除此之外,还有 BitBucket, Coding, 码云,阿里云效平台等等,每个平台都有自己的使用场景和优势, 我们选择最合适自己的平台即可

2.0 Git基本使用方式

在这一节中,我们会演示很多基本的 Git 命令,我们会在操作过程中通过 Git 仓库目录的变化来讲述 Git 的原理,在这个过程中,希望同学们能够跟随我来一起完成这些 Git 操作,通过这个实际操作的过程更深刻的去理解这些命令

常见问题

1.没配置 权限秘钥

2.1 Git 目录介绍

tree .git /F 查看文件 type

HEAD 表示当前指向的分支;config 当前仓库的配置;hooks 配置hook

Object 存储文件信息; refs 存储分支信息;

改代码新建文件 都是在工作区; Git add 加到暂存区;最后commit提交

重点关心一下这个 git 目录,因为我们后续每一个 git 操作都会映射到这个 git 目录之中,通过这里面的文件我们可以映射出所有版本的代码

2.1.1 Git Config

git 配置到底是个什么东西呢,我们又可以配置哪些内容呢,我们一起来了解一下 Git 配置这个概念

local 存在当前.git目录下的config文件; system系统文件配置存在/etc/gitconfig;全局global 存 在当前用户的.gitconfig下

级别:system > global > local

2.1.2 常见 git配置

2.2 Git Remote

Remote: 本地仓库与远端的关联信息

一个仓库拥有多个 remote, 从没有写权限的仓库 fetch 代码,push 到自己有权限的仓库

2.2.1 HTTP Remote

我们知道了什么是 remote 配置后,那我们本地是如何与 remote 进行通信的呢,

一般会通过 http 和 ssh 两种协议,这两种协议都需要对身份进行认证,

类似 go 这种语言,依赖库很多,所以我们需要不断的输入认证的账号密码,肯定是一件很麻烦的事情,因此我们需要配置一下免密的认证方式

一般情况,不推荐从HTTP访问Git,不那么安全,方便

2.2.2 SSH Remote

配置公司钥 还是拉取不下来代码问题 可能原因之一:

存在一种新版本 Windows代码不允许 使用dsa和rsa的key;在SSH层面拒绝访问

2.3 Git Add

(再次强调观察文件变化)了解好基本的 Git 配置后,我们会重点关注一下 Git 命令的原理,接下来我们一起来进行代码的编写和提交,在这个过程中,我们会更深入的去观察 git 目录下的内容变化,来理解我们执行的 git 命令到底做了什么,git 又是如何把代码通过版本管理起来的

2.4 Git Commit

2.5 Object

2.6 Refs

除了 objects 文件有变化,我们发现 refs 的文件内容也有变化

git checkout -b test #切换到新分支

2.7 附注标签

2.8 追溯历史版本

2.9 修改历史版本

2.10 Objects

2.11 Git GC

不设置为过期的话 在日志里面 还能看到 老的commit引用 ,就不能通过GC真实地删掉他

2.12 完整的 Git视图

将 Git 完整的视图描述一遍,重新强调 git 是怎么存储代码历史的。讲完了 Git 本地的存储方式,

引出多人合作和远端仓库同步的概念,从而进入到 Git Clone Pull Fetch 的内容

2.13 Git Clone&Pull&Fetch

2.14 Push 将本地代码 同步至远端

开篇 问题解答

3.0 Git研发流程

常见问题

3.1 不同的工作流

3.2 集中式工作流

3.2.1 集中式工作流-Gerrit

3.3 分支管理工作流

3.3.1 分支管理工作流 Git Flow

3.3.2 分支管理工作流 Github Flow

Branch protection rule

1、必须和request merge 才能提交;1.1、必须有其它人同意才能提交

2、check;3、讨论都被解决了才能提交;4、线性历史(阻止merge节点的产生);

Include Adamin...5、保护 对admin也生效(admin 不能为所欲为)

3.3.3 分支管理工作流 Gitlab Flow

总结这几个工作流的共性是都需要通过 git merge 来合入代码,从而引出介绍代码合并的方式

3.4 代码合并

3.5 如何选择合适的工作流

我们刚刚介绍了不同的工作流方式,以及他们的合入原理,其中有集中式工作流,和分支管理工作流,分支管理又分成典型的 GitFlow, Gitlab Flow, Github Flow

我们有这么多工作流可以选择,那我们又该如何去选择合适的工作流呢。

常见问题答案

总结课程内容

Git 是一个分布式版本控制工具,由 linus 开发,衍生出 github gitlab gerrit 等平台

Git 配置,Git 代码提交,Git 代码同步基本命令,以及 git 管理代码的原理,帮助我们更好的知道如何正确使用 Git 命令

讲述不同的研发流程,有以 gerrit 为代表的集中式工作流,和 gitlab/github 为代表的分支管理工作流,讲述了一些代码提交规范,保护分支,codereview 等概念,帮助我们规范研发流程

希望同学们能够从这节课程中学习到如何使用 Git,以及如何规范我们的研发流程,从而来提升我们的开发效率,以及提升我们的代码质量

非常感谢您阅读到这里,创作不易!如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 收藏 💕评论💬感谢支持!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/104720.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第5步---MySQL的DQL查询语句

第5步---MySQL的DQL查询语句 DQL 数据库查询语言 1.基本的查询语句 1.完整得查询得语句 简化版的查询语句 select * from 表名 where 条件; 2.创建用于测试的表 1.创建测试数据 -- DQL -- 创建测试表 DROP TABLE IF EXISTS product; CREATE TABLE IF NOT EXISTS product( pi…

微信小程序|步骤条

步骤条是现代用户界面设计中常见的元素之一,它能够引导用户按照预定顺序完成一系列任务或步骤。在小程序中,实现步骤条可以为用户提供更好的导航和引导,使用户体验更加流畅和直观。本文将介绍如何在小程序中实现步骤条,并逐步展示实现的过程和关键技巧 目录 步骤条的作用及…

CS144 计算机网络 Lab3:TCP Sender

前言 在 Lab2 中我们实现了 TCP Receiver,负责在收到报文段之后将数据写入重组器中,并回复给发送方确认应答号。在 Lab3 中,我们将实现 TCP 连接的另一个端点——发送方,负责读取 ByteStream(由发送方上层应用程序创建…

设计模式之详解

概念 在软件工程中,设计模式是指软件设计问题的推荐方案。 设计模式一般是描述如何组织代码和使用最佳实践来解决常见的设计问题。 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 好处 设计模式可以提高代码的可重用性和可读…

1.RabbitMQ介绍

一、MQ是什么?为什么使用它 MQ(Message Queue,简称MQ)被称为消息队列。 是一种用于在应用程序之间传递消息的通信方式。它是一种异步通信模式,允许不同的应用程序、服务或组件之间通过将消息放入队列中来进行通信。这…

Linux Day11---mbash项目(二)

观看本文之前请先阅读Linux Day10的相关内容 1.touch 1.1 open系统调用 int open(const char*path,int oflags,mode_t mode); oflags参数: O_APPEND:把写入数据追加在文件的末尾 O_TRUNC:把文件长度设置为0,丢弃已有的内容 O_CREAT:如果需要&#…

vue+file-saver+xlsx+htmlToPdf+jspdf实现本地导出PDF和Excel

页面效果如下(echarts图表按需添加,以下代码中没有) 1、安装插件 npm install xlsx --save npm install file-saver --save npm install html2canvas --save npm install jspdf --save2、main.js引入html2canvas import htmlToPdf from …

【java】LinkedList 和 ArrayList的简介与对比

Java LinkedList和 ArrayList 在使用上,几乎是一样的。由于LinkedList是基于双向链表的,会多出list.getFirst();获取头部元素等方法 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按…

JavaWeb学习-Day10

SpringBootWeb案例 准备工作 开发流程: 开发接口步骤: 删除部门: 新增部门: 简化代码: limit:分页展示,公式:(页数-1)*页面总数,页面总数 目前出现的问题&am…

VR全景:助力乡村振兴,实现可持续发展

引言: 随着科技的飞速发展,虚拟现实(VR)全景技术正在以惊人的速度改变着我们的生活方式和产业格局。全景技术不仅在娱乐、教育等领域取得了巨大成功,也为乡村振兴提供了全新的机遇。通过以乡村为背景的VR全景体验&…

AR室内导航技术之技术说明与效果展示

随着科技的飞速发展,我们周围的环境正在经历着一场数字化的革命。其中,AR室内导航技术以其独特的魅力,为我们打开了一扇通往全新数字化世界的大门。本文将为您详细介绍这一技术的实现原理、工具应用以及成品展示,带您领略AR室内导…

opencv-全景图像拼接

运行环境 python3.6 opencv 3.4.1.15 stitcher.py import numpy as np import cv2class Stitcher:#拼接函数def stitch(self, images, ratio0.75, reprojThresh4.0,showMatchesFalse):#获取输入图片(imageB, imageA) images#检测A、B图片的SIFT关键特征点,并计算…

RunnerGo中WebSocket、Dubbo、TCP/IP三种协议接口测试详解

大家好,RunnerGo作为一款一站式测试平台不断为用户提供更好的使用体验,最近得知RunnerGo新增对,WebSocket、Dubbo、TCP/IP,三种协议API的测试支持,本篇文章跟大家分享一下使用方法。 WebSocket协议 WebSocket 是一种…

【Linux】权限问题

Linux权限 一、Linux 权限的概念二、Linux 权限管理1. 文件访问者的分类2. 文件类型和访问权限(事物属性)3. 文件访问权限的相关设置方法 三、默认权限1. 对文件和目录进行操作需要的权限2. 文件和目录的默认权限3. 粘滞位 一、Linux 权限的概念 Linux …

达梦数据库物化视图介绍

概述 本文将介绍达梦数据库物化视图,给出其概念及相关创建、使用示例。 1.物化视图概念 物化视图 (MATERIALIZED VIEW) 是目标表在特定时间点上的一个副本,占用存储空间,即将查询出来的数据存储在数据库中。当所依赖的一个或多个基表的数据…

bh002- Blazor hybrid / Maui 使用ORM和数据库快速教程

接上篇 bh002- Blazor hybrid / Maui 保存设置快速教程 源码 10. 添加引用 Index.razor.cs 添加引用 using FreeSql.DataAnnotations; #if WINDOWS using Windows.Storage; #endif 11. 简单使用freesql ORM 初始化数据,添加数据 public partial class Index {[DisplayNam…

[oneAPI] 基于BERT预训练模型的命名体识别任务

[oneAPI] 基于BERT预训练模型的命名体识别任务 Intel DevCloud for oneAPI 和 Intel Optimization for PyTorch基于BERT预训练模型的命名体识别任务语料介绍数据集构建使用示例 命名体识别模型前向传播模型训练 结果 参考资料 比赛:https://marketing.csdn.net/p/f3…

Unity - 制作package 插件包

1.将制作的插件包代码放置一个根目录下 2.在跟目录下创建package.json文件 //package.json {"name": "com.unity.customlibrary", //插件包名:com.组织名.包名"displayName": "CustomLibrary", //显示的插件名"v…

OpenCV项目开发实战--基于Python/C++实现鼠标注释图像和轨迹栏来控制图像大小

鼠标指针是图形用户界面 (GUI) 中的关键组件。没有它,您就无法真正考虑与 GUI 进行交互。那么,让我们深入了解 OpenCV 中鼠标和轨迹栏的内置函数。我们将演示如何使用鼠标来注释图像,以及如何使用轨迹栏来控制图像的大小 我们将使用下图来演示 OpenCV 中鼠标指针和轨迹栏功能…

保护函数返回的利器——Linux Shadow Call Stack

写在前面 提到内核栈溢出的漏洞缓解,许多朋友首先想到的是栈内金丝雀(Stack Canary)。今天向大家介绍一项在近年,于Android设备中新增,且默默生效的安全机制——影子调用栈:SCS(Shadow Call St…