【Git版本控制器--3】Git的远程操作
目录
理解分布式版本控制系统
创建远程仓库
仓库被创建后的配置信息
克隆远程仓库
https克隆仓库
ssh克隆仓库
向远程仓库推送
拉取远程仓库
忽略特殊文件
为什么要忽略特殊文件?
如何配置忽略特殊文件?
配置命令别名
标签管理
理解标签
标签操作
理解分布式版本控制系统
为什么要有分布式版本控制系统?
在之前的文章中,我们已经对Git的使用有了一个认知,但我们之前的git操作全部都是对本地仓库的管理,不管是分支管理还是基本操作...
本地仓库是保存在一台服务器中的。这意味着,假设你需要与你的同事一块进行多人开发,那么你和你的同事需要围在一台电脑上进行开发,那么这样子的开发不仅仅不会提高开发效率,甚至在某些情况下会降低开发效率!
所以我们需要有方式能够让你和你的同事在不同的电脑上拿到同一个仓库的内容,而在git中,分布式版本控制系统完美做到了!
什么是分布式版本控制系统?
在还没有分布式版本控制系统时,你需要与你的同事进行多人开发,那么其实也有方案:
你可以把你的本地仓库,原封不动的拷贝给你的同事,你的同事也可以把他的本地仓库原封不动的拷贝给你!这样就实现了不同主机之间可以拿到同一个仓库!

这种方案与本地仓库相比带来了好处:当你的本地仓库因为某些突发情况丢失时,你的同事那还有备份,提高了安全性!
但这种方案也有着一些问题:
- 直接进行拷贝相对比较麻烦
- 当你的同事因为某些原因,例如:生病了,离职了...时,你无法拿到你同事的本地仓库。这就带来了局限性
基于上述原因,我们不考虑这种将本地仓库直接拷贝的方案
第二种解决方案:
创建一个中央服务器。中央服务器的仓库中保存着项目的内容。中央服务器把你和你同事的电脑进行连接,这意味着你和你的同事可以在自己的计算机上对中央服务器仓库中的内容进行克隆。这样,你们能拿到同一个仓库!
当你对仓库的内容进行了修改时,你把你的修改完的仓库内容上传到中央服务器中,这个动作我们称之为推送!
当你需要拿到你同事的修改内容时,直接把中央服务器中你同事的仓库内容拿到本地,这个动作我们称之为拉取!

这种方案解决了第一种方案所产生的各种问题!这一套体系是集中式版本控制系统,即包含图中所有电脑的本地仓库与中央服务器仓库构成的一套系统!而git所提供的分布式版本控制系统的基础就是集中式版本控制系统,它包含了集中式版本控制系统的所有优点,但提供了比起这种方案更强大、更灵活的多人协作开发功能!
若我们维护一个仓库时,还需要手动架构一台中央服务器,那么成本是巨大的!
所以很多网站为我们提供了中央服务器的功能,例如github、码云...(后续用码云)
我们可以把自己的本地仓库推送到这些网站中,别人也能从这些网站中拉取我们的仓库,实现了多人协作的功能!所以这些网站充当的相当于中央服务器的角色
创建远程仓库
当我们注册并登录上码云后,如下步骤:


仓库名称是必填项,并且仓库名称尽量与它的内容相对应!
仓库被创建后的配置信息
ReadMe文件模板
ReadMe文件模板:当勾选该选项时,创建仓库后会自动生成一个ReadMe文件,ReadMe文件用于对该仓库的说明。自动生成的ReadMe文件有中英文两个版本
实际上,ReadMe文件就相当于一个使用说明书一样的东西!

成员管理
仓库成员管理:在仓库页面的右上方可以对仓库的成员进行管理!说明一个仓库是能进行多人开发的
如下为git手册中对成员身份的描述:

Issue文件
通过git对成员身份的描述可以发现,每一个成员都能创建一个名为Issue的东西
实际上Issue就是对该仓库中的某个事件进行描述的,比如说bug之类的!每一个人都能提交自己的Issue,并通知仓库管理员来解决

若在创建仓库时勾选了Issue模板文件,则新建Issue时如下:

新增Issue时有一些配置选项:
- 负责人:该问题你需要通知谁来解决!
- 标签:该Issue描述的是什么事件,可以填例如bug,duplicate...
- 分支:你描述的问题是在哪个分支下发现的
- .....
如下为创建好一个Issue时的样子:

当该问题被解决时,记得对Issue设置为已完成状态

Pull Request文件
我们都知道,当一个分支的内容写完了,那么它需要合并到master分支上。
但不是什么内容都能被合并到master分支上的,假设你的代码中存在了很多bug,合并到master分支上,导致线上运行环境崩溃,那么就gg了。
但不是每一个开发人员都了解这些的,所以需要有硬性要求约束开发人员。
所以在合并之前,你需要询问仓库的管理员是否可以合并,若管理员同意,那么你才能进行合并操作!
如何询问?提交一份Pull Request请求给管理员!
若在创建仓库时勾选了Pull Request文件模板,那么会在仓库中生成如下文件

这份文件是给开发人员看的,要求开发人员在提交Pull Request时的格式
如何提交一份Pull Request?


克隆远程仓库
克隆远程仓库的协议有两个
- https协议
- SSH协议
区别:
- SSH克隆:使用SSH(Secure Shell)协议进行克隆,该协议通过加密技术保护数据传输过程中的机密性和完整性,防止数据被窃取或篡改。同时,SSH协议使用公钥加密技术进行身份验证,进一步增强了安全性,可以防止密码被盗取或猜测。
- HTTP克隆:通过HTTP或HTTPS协议进行克隆,虽然HTTPS也提供了加密通信,但在身份验证方面相对较弱,通常依赖于用户名和密码进行验证,这可能存在被暴力破解或泄露的风险。
- 总而言之SSH克隆比起https克隆更加安全
https克隆仓库


复制完https的地址时,可以使用如下指令在Linux中克隆一份仓库:
git clone [远程仓库地址(https)]
注意:不要在本地仓库下直接进行clone操作,因为clone也会生成一份.git版本库,直接克隆会导致本地仓库下的.git被覆盖!

此时本地和远程仓库之间的结构图如下:

clone完以后会在本地生成一个对应的本地仓库!
origin表示远程仓库默认名称
查看远程仓库名称:(必须在仓库的工作区下)
git remote
查看更详细的信息可以使用-v选项

使用-v选项会出现两个地址,与其相对应的权限
图上的内容为,我既有对远程仓库的拉取权限又有远程仓库的推送权限
ssh克隆仓库
SSH协议使用公钥加密技术进行身份验证。在配置SSH克隆时,用户需要在本地生成SSH密钥对,并将公钥添加到Git托管服务上。这样,在克隆仓库时,Git托管服务会使用公钥来验证用户的身份,确保只有授权的用户才能访问和克隆仓库。
如何配置公钥
第一步:

第二步:

第三步:填写公钥信息即可完成公钥的配置

标题:可以按照自己喜欢的设置
接下来的重点是获取我们本地服务器的公钥
获取本地服务器的公钥
第⼀步:创建SSH Key。在用户主⽬录下,看看有没有.ssh⽬录,如果有,再看看这个⽬录下有没有 id_rsa 和 id_rsa.pub 这两个⽂件,如果已经有了,可直接跳到下⼀步。如果没有,需要创建 SSH Key:
创建SSH Key:
ssh-keygen -t rsa -C "[邮箱]"
输入完上述指令后一路回车即可!
注意:邮箱必须与我们在码云上配置的邮箱相同

经过配置之后,我们的家目录下就有了ssh文件,里面保存着公钥(id_rsa)和私钥(id_rsa.pub)
第二步:查看id_rsa.pub内容,并把查看到的内容复制到码云的公钥配置项上
弹出如下页面表示配置成功

ssh克隆仓库
配置好公钥以后,我们就可以使用ssh的方式进行克隆了。流程几乎与https一样,如下步骤:
第一步:

第二步:

第三步:在Linux下输入如下指令
git clone [复制的内容]
向远程仓库推送

向远程仓库推送的整个过程:
- 在工作区中对代码完成修改
- 通过add操作把修改内容添加到暂存区
- 通过commit操作把修改内容添加到master分支
- 把master分支修改内容推送到远程仓库,即push操作
根据图中我们可以看出,实际上push操作是分支与分支之间的交互,即本地仓库中的master分支推送到远程仓库中的master分支,这两个分支不是同一个分支!
push操作对应指令:
git push [远程仓库名] [本地分支名]:[远程分支名]
若本地分支名与远程分支名一致,那么可以把远程分支名进行省略
注意:若采用的是ssh的方式进行push操作,那么无需输入用户名和密码,若是https的方式则需要输入用户名和密码!

拉取远程仓库
什么场景下需要拉取远程仓库?
假设你和你的同事一起开发了一个产品,并推送到了远程仓库中,此时你的仓库、你同事的仓库、远程仓库中该产品的版本都是version0版
突然某一天,你的同事开发了一个新的功能,此时你的同事的产品版本更新成了version1版,它把它的version1版的代码推送到了远程仓库中,远程仓库中产品的版本也变为了version1版,但你的仓库里面的版本是version0版,若你也需要拿到这个version1版,你就需要拉取远程仓库中的version1版本的代码!
如何拉取?
拉取远程仓库中的内容:
git pull [远程仓库名] [本地分支名]:[远程分支名]
注意:pull不仅仅是拉取了远程仓库中的内容,而且还把拉取得内容与本地分支进行合并!
与push一样,若我们的本地分支名和远程分支名一样,那么远程分支名可以省略!
案例演示
为了方便演示,我使用码云平台提供的代码编辑功能手动更新代码,如下方法:

修改后:

注意:实际开发中,不要手动编辑代码!
之后远程仓库中的代码被修改,我们在Linux中使用pull操作拉取远程仓库的内容

忽略特殊文件
为什么要忽略特殊文件?
在⽇常开发中,我们有些⽂件不想或者不应该提交到远端,⽐如保存了数据库密码的配置⽂件,那怎么让Git知道呢?在Git⼯作区的根⽬录下创建⼀个特殊的 .gitignore ⽂件,然后把要忽略的⽂件 名填进去,Git就会⾃动忽略这些⽂件了。
有人可能会说,假设是不想让配置文件进行提交,那么我们在add的时候不添加这些配置文件不就可以了吗?
实际上,这种方法硬要说的话也行!但在我们实际开发中,我们一般一次开发修改的是十几个文件,你难道要一个一个add吗?我们常用的方式是git add . 把当前目录所有修改内容都add。但若你add时恰好有一个配置文件被修改了,那不就上传到git了吗?
如何配置忽略特殊文件?

在我们创建的时候有一个.gitignore模板,我们如果勾选了的话直接修改里面的内容就可以了!
但若我们没有勾选也没关系,我们直接在工作区创建一个.gitignore即可
接下来的问题是,.gitignore中的内容我们如何设置呢?
忽略某个特殊文件
假设我们想忽略某一个特殊文件,我们直接直接在.gitignore中把该文件的文件名添加到.gitignore中

上图中,由于file.abc被ignore了,我们无法添加该文件
忽略某一类特殊文件
除了忽略某一个特殊文件以外,我们还可以忽略一类文件,例如.efg结尾的文件,把*.efg添加到.gitignore中即可

我们在日常开发中,肯定不会这样指定一个被忽略的文件,一般都是被忽略的文件和要上传的文件放到一起,那么此时git不会提示,而是自动把被忽略的文件不放到暂存区,未被忽略的文件放到暂存区中


可以看到,只有file.txt被推送到了远程仓库中,而file.abc和file.efg都被忽略了
不忽略某个特殊文件
注意:若我们想要强制添加被忽略的文件,可以在add时带上-f选项即可,
当然,若是add时带上-f选项,显然破坏了.gitignore的忽略规则,所以一般不建议这样使用,我们若只是想add一个特殊的文件,假设这个特殊的文件是test.abc,那么把!test.abc添加进.gitignore,此时就不会忽略这一个文件!

可以看到test.abc被成功添加到了暂存区中!
.gitignore文件内容非常多,查看被忽略原因所在的行数
接下来的场景是假设你的.gitignore中的内容已经非常多了,你不知道具体忽略了哪些文件,git提供了方法可以让你查看到该文件被忽略原因在.gitignore中的第几行
查看被忽略的原因所在的地方:
git check-ignore -v [文件名]

如图中,查看到file.efg被忽略原因是因为.gitignore中有一行是*.efg,行数是第二行,文件是.gitignore
配置命令别名
在我们实际开发中,可能有的git命令非常长,导致我们每次输入时的不方便,我们可以使用如下方法对git命令进行取别名
配置全局命令别名:
git config --global alias.[新名字] '[老名字]'
例如:

有些时候,我们设置了命令别名可能自己也忘记了,可以通过如下方法查看所有的命令别名
查看配置的全局命令别名:
git config --global --get-regexp alias
例如:

若我们不想使用命令别名了,可以使用如下方法删除命令别名
删除全局某个命令别名:
git config --global --unset alias.[命令别名]
例如:

删除全局所有命令别名:
git config --unset-all
标签管理
理解标签
什么是标签?
git中,标签是用来标识某些特殊提交的一种记号,比如产品上线时的提交,一般都需要打上标签
为什么要有标签
git中不是每一次提交的时候都有commit id吗?commit id能唯一标识一次提交,为什么还需要标签呢?
commit id vs 标签:
- commit id:通过哈希算法得出来的,本身比较长,难以记忆!并且commit id都是无意义的一串字符
- 标签:通过开发人员手动打上的标签,通常都要保证尽量简短且与提交内容有强关联!标签被设置出来就是有意义的,方便开发人员查看!
- commit id 每一次提交都有,当提交过多时会导致难以查看。而只有当重要提交上传时才会打上标签,所以实际开发中打上标签的提交不会非常多,容易查看!
所以标签是针对重要的提交,我们可以为该提交打上标签,方便管理
例如:产品上线时的提交可以打上v1.0的标签,表示版本号!
对于开发人员来说,被打上标签的提交通常都是具有里程碑意义的!并且当开放人员想进行重要版本的回退时,可以根据标签迅速完成版本回退,提升了开发效率!
标签操作
本地操作
添加标签:
git tag [标签名]
上述命令的默认行为是为我们最近一次提交打上标签
查看有哪些标签:
git tag
注意:添加标签后,会在.git/refs/tags目录下保存了名字与标签名相同的文件,这个文件的内容是commit id
示例:
为非最新的提交打上标签:
git tag [标签名] [commit id]
有些时候,我们可能不仅仅需要添加标签,还需要添加对该标签的描述信息,可以使用如下方法:
标签描述:
git tag -a [标签名] -m"[标签描述]" [commit id]
若不写commit id的话,默认是最近一次提交!
查看标签描述:
git show [标签名]
删除标签:
git tag -d [标签名]
示例:

远端操作

标签也可以推送给远端仓库
推送一个标签:
git push [远程仓库名] [标签名]
推送所有标签:
git push origin --tags
若我们不需要远程仓库中的某一个标签,不建议直接在码云上手动删除,最好是先在本地删除,再把本地仓库与远程仓库进行同步:
本地删除后与远程仓库的同步:
git push [远程仓库名] :[标签]
#本质是把本地的删除同步到远端
相关文章:
【Git版本控制器--3】Git的远程操作
目录 理解分布式版本控制系统 创建远程仓库 仓库被创建后的配置信息 克隆远程仓库 https克隆仓库 ssh克隆仓库 向远程仓库推送 拉取远程仓库 忽略特殊文件 为什么要忽略特殊文件? 如何配置忽略特殊文件? 配置命令别名 标签管理 理…...
批量创建ES索引
7.x from elasticsearch import Elasticsearch# 配置 Elasticsearch 连接 # 替换为你的 Elasticsearch 地址、端口、用户名和密码 es Elasticsearch([http://10.10.x.x:43885],basic_auth(admin, XN272G9THEAPYD5N5QORX3PB1TSQELLB) )# # 测试连接 # try: # # 尝试获取集…...
模块初阶学习
当我们在过去想要实现一个功能时,例如Swap交换函数时,我们需要不断考虑参数的正确与否。如果是在c语言,我们还需要不断更改函数名字,以防止函数名重复。在c我们可以通过函数名重载解决这个问题,但还是有一些小问题&…...
rust学习-rust中的保留字
rust学习-rust中的保留字 已使用的保留字未来可能使用的保留字 保留字是语言中预定义的标识符,不能用作变量名、函数名或其他自定义标识符,Rust的保留字大致可以分为两类:已使用的保留字和未来可能使用的保留字 已使用的保留字 as࿱…...
MySQL中的读锁与写锁:概念与作用深度剖析
MySQL中的读锁与写锁:概念与作用深度剖析 在MySQL数据库的并发控制机制中,读锁和写锁起着至关重要的作用。它们是确保数据在多用户环境下能够正确、安全地被访问和修改的关键工具。 一、读锁(共享锁)概念 读锁,也称为…...
专利申请的价值
独占市场 一种产品只要授权专利权,等于在市场上拥有独占权。 政策奖励 各地方政府均出台响应文件, 对专利申请者进行奖励或者补助。 申报项目 申报高新技术企业、创新基金等 各类计划、项目的必要前提条件 专利申请 技术保护 防止新的技术与产品被他人 抄…...
使用 OpenCV 和 Python 轻松实现人脸检测
目录 一、准备工作 二、加载人脸检测模型 三、读取图像并进行人脸检测 四、处理视频中的人脸检测 五、优化人脸检测效果 六、总结 在人工智能和计算机视觉领域,人脸检测是一项非常基础且重要的技术。通过人脸检测,我们可以在图像或视频中识别并定位人脸,进而进行后续的…...
自然语言处理——从原理、经典模型到应用
1. 概述 自然语言处理(Natural Language Processing,NLP)是一门借助计算机技术研究人类语言的科学,是人工智能领域的一个分支,旨在让计算机理解、生成和处理人类语言。其核心任务是将非结构化的自然语言转换为机器可以…...
kotlin内联函数——runCatching
1.runCatching作用 代替try{}catch{}异常处理,用于捕获异常。 2.runCatching函数介绍 参数:上下文引用对象为参数返回值:lamda表达式结果 调用runCatching函数,如果调用成功则返回其封装的结果,并可回调onSuccess函…...
2025年新开局!谁在引领汽车AI风潮?
汽车AI革命已来。 在2025年伊始开幕的CES展上,AI汽车、AI座舱无疑成为了今年汽车行业的最大热点。其中不少车企在2025年CES上展示了其新一代AI座舱,为下一代智能汽车的人机交互、场景创新率先打样。 其中,东软集团也携带AI驱动、大数据支撑…...
YOLO目标检测3
一. 参考资料 《YOLO目标检测》 by 杨建华博士 本篇文章的主要内容来自于这本书,只是作为学习记录进行分享。 二. 搭建YOLOv1的网络 2.1 YOLOv1的网络结构 作者带我们构建的YOLOv1网络是一个全卷积结构,其中不包含任何全连接层,这一点可以…...
css3 svg制作404页面动画效果HTML源码
源码介绍 css3 svg制作404页面动画效果HTML源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果 效果预览 源码如下 <!doctype html> <html> <head> <meta charse…...
LINUX 平台最快子网路由转发,内核使能选项配置
阅读本文之间,可线性参考以下文献。 Linux 命令行配置为单臂旁路由。_linux单臂路由-CSDN博客 Linux 软路由命令行配置(参考)_linux软路由-CSDN博客 VGW在 Windows 平台上局域网就绪的旁路由器程序_windows旁路由-CSDN博客 本文介绍 LINUX…...
「 机器人 」扑翼飞行器混合控制策略缺点浅谈
前言 将基于模型的控制与强化学习策略融合在扑翼飞行器中,虽然能够兼顾系统稳定性与极限机动能力,但也面临了更高的系统复杂性、对硬件算力与可靠性的额外要求,以及难以回避的能量效率等方面挑战。以下从四个方面进行归纳与分析。 1. 系统复杂性增加 1.1 两种控制方法的并存…...
RNN实现阿尔茨海默症的诊断识别
本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 一 导入数据 import torch.nn as nn import torch.nn.functional as F import torchvision,torch from sklearn.preprocessing import StandardScaler from torch.utils.data import TensorDatase…...
HackTheBox靶机:Sightless;NodeJS模板注入漏洞,盲XSS跨站脚本攻击漏洞实战
HackTheBox靶机:Sightless 渗透过程1. 信息收集常规探测深入分析 2. 漏洞利用(CVE-2022-0944)3. 从Docker中提权4. 信息收集(michael用户)5. 漏洞利用 Froxlor6. 解密Keepass文件 漏洞分析SQLPad CVE-2022-0944 靶机介…...
docker安装elk6.7.1-搜集java日志
docker安装elk6.7.1-搜集java日志 如果对运维课程感兴趣,可以在b站上、A站或csdn上搜索我的账号: 运维实战课程,可以关注我,学习更多免费的运维实战技术视频 0.规划 192.168.171.130 tomcat日志filebeat 192.168.171.131 …...
XML实体注入漏洞攻与防
JAVA中的XXE攻防 回显型 无回显型 cve-2014-3574...
Flutter 与 React 前端框架对比:深入分析与实战示例
Flutter 与 React 前端框架对比:深入分析与实战示例 在现代前端开发中,Flutter 和 React 是两个非常流行的框架。Flutter 是 Google 推出的跨平台开发框架,支持从一个代码库生成 iOS、Android、Web 和桌面应用;React 则是 Facebo…...
使用 Docker Compose 一键启动 Redis、MySQL 和 RabbitMQ
目录 一、Docker Compose 简介 二、服务配置详解 1. Redis 配置 2. MySQL 配置 3. RabbitMQ 配置 三、数据持久化与时间同步 四、部署与管理 五、总结 目录挂载与卷映射的区别 现代软件开发中,微服务架构因其灵活性和可扩展性而备受青睐。为了支持微服务的…...
【问题解决】el-upload数据上传成功后不显示成功icon
el-upload数据上传成功后不显示成功icon 原因 由于后端返回数据与要求形式不符,使用el-upload默认方法调用onSuccess钩子失败,上传文件的状态并未发生改变,因此数据上传成功后并未显示成功的icon标志。 解决方法 点击按钮,调用…...
spring框架之IoC学习与梳理(1)
目录 一、spring-IoC的基本解释。 二、spring-IoC的简单demo(案例)。 (1)maven-repository官网中找依赖坐标。 (2).pom文件中通过标签引入。 (3)使用lombok帮助快速开发。 ÿ…...
MQ的可靠消息投递机制
确保消息在发送、传递和消费过程中不会丢失、重复消费或错乱。 1. 消息的可靠投递 消息持久化: 消息被发送到队列后会存储在磁盘上,即使消息队列崩溃,消息也不会丢失。例如:Kafka、RabbitMQ等都支持持久化消息。Kafka通过将消息存…...
Mono里运行C#脚本35—加载C#语言基类的过程
前面大体地分析了整个Mono运行过程,主要从文件的加载,再到EXE文件的入口点, 然后到方法的编译,机器代码的生成,再到函数调用的跳板转换,进而解析递归地实现JIT。 但是还有很多功能没有解析的,就是C#语言相关最多的,就是类的加载,以及类语言设计的实现属性, 比如类的…...
location+rewrite实现隐性域名配置
隐性域名:访问www.a.com 则跳转到www.b.com的页面,但是地址栏还是显示www.a.com 1、配置基于根目录的隐性域名(就是nginx反向代理) 访问http://www.bbb.org:8002, 跳转http://www.accp.org:8001的页面,地址…...
150 Linux 网络编程6 ,从socket 到 epoll整理。listen函数参数再研究
一 . 只能被一个client 链接 socket例子 此例子用于socket 例子, 该例子只能用于一个客户端连接server。 不能用于多个client 连接 server socket_server_support_one_clientconnect.c /* 此例子用于socket 例子, 该例子只能用于一个客户端连接server。…...
centos7 配置国内镜像源安装 docker
使用国内镜像源:由于 Docker 的官方源在国内访问可能不稳定,你可以使用国内的镜像源,如阿里云的镜像源。手动创建 /etc/yum.repos.d/docker-ce.repo 文件,并添加以下内容: [docker-ce-stable] nameDocker CE Stable -…...
周末总结(2024/01/25)
工作 人际关系核心实践: 要学会随时回应别人的善意,执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己,抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内,职场社交不要放在5min以外 职场的人际关系在面对利…...
【go语言】map 和 list
一、map map 是一种无序的键值对的集合。 无序 :map[key]键值对:key - value map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。map 是一种集合,所以我们可以像迭代数组和切片那样迭代他。…...
PCIe 个人理解专栏——【2】LTSSM(Link Training and Status State Machine)
前言: 链路训练和状况状态机LTSSM(Link Training and Status State Machine)是整个链路训练和运行中状态的状态转换逻辑关系图,总共有11个状态。 正文: 包括检测(Detect),轮询&…...
