WordPress Grace8.2主题/福州网站优化公司
作为一个工作两年的开发同学,git是每天都要接触的工具。但IDEA对git的封装已经满足了日常的代码提交需求,所以一直是以点点点的形式进行代码提交与更新,几乎没用命令行提交过(现在想来也是有些惭愧),对于git架构与底层也了解甚少。近期刚好研究代码相关,就趁此机会把git完整的学习一下。
1. 入门介绍
1.1 版本控制系统
git的本质是版本控制系统。版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制系统主要分为集中式、分布式,分别以svn、git为代表。
1.1.1 集中式版本控制系统 - CVCS
CVCS
有一个集中管理的服务器用来保存所有的修订版本,开发同学们通过客户端连接到服务器,获取最新的文件或更新文件。从图例中就可以看出CVCS的特点:单点、网络强依赖。

SVN
常见的subversion,现归属Apache,是代表性的集中式版本控制系统,除此之外还有TortoiseSVN。通常都是可爱的小乌龟图案。

1.1.2 分布式版本控制系统(DVCS)
DVCS
不再使用中央仓库, 取而代之的是本地仓库与远端仓库。本地仓库里包含了所有的版本历史,与本地仓库交互并不需要网络。

Git
大部分版本控制系统存储的是每个文件与初始版本的差异。但git与常见的版本控制系统并不同。git以快照的形式来进行不同版本的保存。提交更新或保存项目状态时,对当时的全部文件创建一个快照并保存这个快照的索引。如果文件没有修改只保留一个链接指向之前存储的文件。常见的有gitlab、github。
1.1.3 对比
集中式与分布式版本控制系统的最大区别在于,版本控制的位置在中央服务器还是本地电脑。
集中式 | 分布式 | |
服务器故障时是否可提交 | ❌ | ✅ |
无网络也可工作 | ❌ | ✅ |
1.2 Git
1.2.1 结构
分支(Branch):一条独立的开发线,与与开发主线分离,可在不影响主线的同时工作。
工作区(Workspace):本地的代码区。
暂存区(Staging Area):临时存放代码的改动,即文件.git/index。
本地git仓库(Local Repository):存储于本地,含有所有版本的项目数据。
远程git仓库(Remote Repository):存储于远端,含有所有版本的项目数据。

1.2.2 特点
git 更像是一个小型的文件系统,提供了许多以此为基础构建的超强工具,而不只是一个简单的 VCS。
- 三种状态:commited(已提交)、modified(已修改)、staged(已暂存)
- 三个工作区:工作区、暂存区域、Git 仓库(远程&本地)
- 保证完整性:丢失信息后及时发现。通过SHA-1的哈希计算校验和,判断信息完整性
- 一般只添加数据:commit后,数据很难丢失
- 近乎所有操作都是本地执行: 速度极快,无需网络也可提交
2. 基础使用
2.1 提交流程
如果是研发人员,对git的提交绝对不陌生。在日常中使用git最高频的操作是将自己最新的修改推到远端分支,具体的操作流程如下:
- 在工作区中修改文件。
- 暂存文件,将文件的快照放入暂存区域。
- 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
2.2 使用方式
git主要两大使用方式:图形化页面、命令行。
2.2.1 图形化页面
在许多ide中都可以通过点击页面菜单的方式进行git commit、push等操作。如下图就是IDEA中的git操作菜单,可以看到已支持的命令可覆盖大部分的日常git使用需求,但依旧无法支持全部git指令。使用起来较为简便,只需要点点点即可。

2.2.2 命令行
在Terminal中直接手敲命令完成git交互。可执行全部git指令,根据所需自定义参数等。需要手动输入命令,但灵活性较高。

2.3 常用命令
总结了日常使用中最常用的六条命令如下。文章末尾也总结了git的大部分命令列表。
git add | 增加git对指定文件的跟踪,将文件增加到暂存区 |
git pull | 将远程仓库的代码拉到本地 |
git push | 将代码从本地仓库上传到远程仓库 |
git clone | 将一个远程仓库中的项目拷贝到本地 |
git commit | 将所选暂存区的文件提交到本地仓库 |
git checkout | 切换分支 |
3. 关键组件
3.1 文件
3.1.1 文件状态
一个文件在本地的状态变化主要有未跟踪、未修改、已修改、已暂存四种,会根据用户的操作不断变化。
3.1.2 忽略文件
在项目中有些文件无需纳入git管理,比如运行过程数据等。可记录在项目根目录的.gitignore中,去除git对该文件的管理。
GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表,详见https://github.com/github/gitignore
3.2 标签
git支持打标签的方式来记录关键节点,可用于记录发布版本等。可以通过在特定的标签上创建一个新分支来复现打了标签的版本。
3.2.1 标签类型
轻量标签(lightweight):一个特定提交的引用。
附注标签(annotated):存储在 Git 数据库中的一个完整对象。通常创建的标签都是附注标签。
3.2.2 标签命令
标签列表 | git tag | 列出已有的标签 |
git show ${标签名} | 某个标签信息与对应的提交信息 | |
创建标签 | git tag -a ${标签名} -m ${备注} | 创建附注标签 |
git tag ${标签名} | 创建轻量标签 | |
git tag -a ${标签名} ${某个提交的校验和} | 基于已有的提交创建标签 | |
git push origin ${标签名} | 将标签推到服务器上 | |
恢复标签 | git checkout -b ${分支名} ${标签名} | 标签代码的恢复依赖于分支 |
3.3 分支
几乎所有的版本控制系统都以某种形式支持分支。分支可以把个人的开发工作从主线上分离,以免影响开发主线。 在很多版本控制系统中,这是一个略微低效的过程——常常需要完全创建一个源代码目录的副本。对于大项目来说,这样的过程会耗费很多时间。git 的分支,其实本质上仅仅是指向提交对象的可变指针。做些修改后再次提交,那么这次产生的提交对象会包含一个指向上次提交对象(父对象)的指针。
3.3.1 类型

master | 主分支,代码的正式版本。原则上不能直接在master分支上修改,只能从其他分支合并。 其实master与其他分支并无不同,之所以用master做主分支,是因为git init默认创建的分支就是master,大家懒得改。 |
develop | 主开发分支,包含要发到下一个release分支的代码。 |
feature | 功能分支,主要用于开发新功能的分支。aone上新建变更后拉出的就是feature分支 |
release | 预发布分支,在发布正式版本前,将待发布的分支都合并到release分支,打出一个预期发布版本。Aone上多分支发布的集成分支就是release分支。 |
hotfix | bug修复分支,做短小精悍的bug修复。 |
3.3.2 常用指令
git branch | 创建新分支 ,相当于在当前所在的commit 上创建一个指针。Git 的分支实质上仅是包含所指对象校验和的文件,所以它的创建和销毁都异常高效。 |
git checkout | 切换分支 |
3.3.3 HEAD指针
概念
HEAD指针总是通过分支指针,间接的指向当前分支的最新提交。
样例
文字可能不好理解,我们直接看git中的head指向就明白了。在命令行中进入某个项目的文件夹,目前处于master分支。进入.git文件夹,里面包含一个HEAD文件。
查看head文件内容,发现指向另一个文件 refs/heads/master
那么我们继续查看这个文件,发现是一串commit id
head所指向的commit id就是master最新一次提交的commit id
3.4 Commit
3.4.1 Commit的组成
blob:提交的文件,一个文件的一个版本对应一个blob对象
tree:目录,一个tree对象内部聚合了另一些tree或者blob
commit:一次提交.一个commit可以理解为某一个版本下的仓库的各个文件以及文件夹的快照。相当于聚合了这个版本下的blob以及tree对象。commit同时也会包含提交信息以及parent的commit。

3.5 协议
在clone项目时,有两种方式:SSH、HTTPS。
3.5.1 SSH
安全性较高,需要生成SSH密钥,并将本地公钥上传至gitlab。
3.5.2 HTTPS
安全性较弱,使用用户名与密码登录。
4. 展开说说
4.1 别名的使用
可以对一些常用指令设置别名,减少每次的打字数
比如git commit,我想自定义成git ci,可设置git别名
git config --global alias.ci commit
后续commit只需要输入git ci即可。
4.2 git到底怎么读
这可以说是一个很有趣的话题了,作为一个"交友网站",读法还是十分多样的,大概如下:
- [git]
- [dʒit]
- [geit]
具体怎么读,并没有标准答案,目前博主读的是[git],参照Linus的读法。原视频
5. 命令汇总
常用指令 | |
git clone | 将一个远程仓库中的项目拷贝到本地 |
git add | 增加git对指定文件的跟踪,将文件增加到暂存区 |
git commit | 将所选暂存区的文件提交到本地仓库 |
git push | 将代码从本地仓库上传到远程仓库 |
git pull | 将远程仓库的代码拉到本地 |
git checkout | 切换分支 |
分支 | |
git branch | 创建新分支 |
git log | 按提交时间列出分支上的所有的更新 |
git reset | 撤销操作,将head回退至指定状态 |
git merge | 分支合并 |
git diff | 工作目录中当前文件和暂存区域快照之间的差异 |
标签 | |
git tag | 列出已有的标签 |
git show ${标签名} | 某个标签信息与对应的提交信息 |
git tag -a ${标签名} -m ${备注} | 创建附注标签 |
git tag ${标签名} | 创建轻量标签 |
git tag -a ${标签名} ${校验和} | 基于已有的提交创建标签 |
git push origin ${标签名} | 将标签推到服务器上 |
git checkout -b ${分支} ${标签} | 将标签记录的阶段代码恢复到分支上 |
仓库 | |
git init | 初始化仓库 |
git config --list | 列出所有 Git 当时能找到的配置。 |
git status | 查看文件所处状态 |
git ls-remote (remote) | 远程引用的完整列表 |
git fetch | 拉取最新的远程仓库分支,本地仓库不变 |
附
Pro Git 中文版(第二版)
相关文章:

Git天天用,不得不看的那些事
作为一个工作两年的开发同学,git是每天都要接触的工具。但IDEA对git的封装已经满足了日常的代码提交需求,所以一直是以点点点的形式进行代码提交与更新,几乎没用命令行提交过(现在想来也是有些惭愧),对于gi…...

IDE 文档注释使用,模板注释,ide配置templates
文档注释基于javadoc模板 类注释 /*** 暂无介绍** author admin* version 1.0.0* <dt><span class"simpleTagLabel">时间:</span></dt>* <dd>2023/2/24</dd>*/方法注释 /*** 暂无描述** author admin* param args */javadoc相…...

力扣-查询近30天活跃用户数
大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:1141. 查询近30天活跃用户数二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.其他总结前言 一、题目&…...

企企通聚源池| 聚合海量资源全网寻源,赋能供采双方撮合交易
目前,我们正处于一个飞速发展的信息时代,随着大数据时代的来临,在企业的日常经营中,数据无处不在,各类数据的采集、整合、分析对企业的发展、决策有着十分重要的作用。数据管理作为企业一项重要的建设工作,…...

【算法数据结构体系篇class09】:链表问题:快慢指针、回文结构、复制、中点,分区、相交
一、链表解题的方法论 1)对于笔试,不用太在乎空间复杂度,一切为了时间复杂度2)对于面试,时间复杂度依然放在第一位,但是一定要找到空间最省的方法二、链表常用数据结构和技巧1)使用容器(哈希表、数组等)2)快…...

实验室信息化管理行业方案
为适应新时代下的管理机制与应用场景,越来越多的检测实验室需对研发部门和实验部门进行全面的、现代化的、电子化的综合管理,帮助检测机构对实验室的规划与计划、项目立项与管理、项目成果、合同,以及基建等工作进行统一的管理,而…...

docker学习
docker 环境搭建 MySql # mysql5.7 docker run --name mysql10 -p 3306:3306 -v D:\MySql\conf:/etc/mysql/conf.d -v D:\MySql\data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 -d mysql:5.7docker run --name mysql10 -p 3306:3306 -v /etc/mysql/conf.d:/etc/mysql/co…...

Linux 常用命令
重启 # 重启(root 用户操作) reboot# 强制重启 reboot -f关机 # 关机 # shutdown [OPTION] [TIME] [MESSAGE] shutdown-h 关机 -r 重启-c 取消上一个命令 第二个参数指的是多少分钟后执行操作,以分钟为单位,如果不加时间&am…...

数据结构-顺序表(2)
目录 1. 线性表 2. 顺序表 2.1 动态顺序表 3. 接口实现 前期工作 3.1 初始化、销毁与检查容量 3.1.1 初始化 3.1.2 销毁 3.1.3 检查容量 3.2 尾插 3.3 尾删 3.4 头插 3.5 头删 3.6 插入 3.7 删除 顺序表源码 SeqList.h SeqList.c test.c 写在最后ÿ…...

初学C/C++内存管理--new和delete的使用
一,内存分布 栈区: 一般的局部变量和函数的返回数据以及返回地址,函数的参数都在战栈区上开辟空间。栈区开空间一般由编译器自动管理,出了生命周期自动释放。也可以通过一些方式自己手动开辟栈区空间,不过一般用不到…...

【Java】volatile
一、volatile volatile是Java虚拟机提供的轻量级的同步机制,它有3个特性: 1)保证可见性 2)不保证原子性 3)禁止指令重排 当写一个volatile变量时,JMM会把该…...

混沌工程 Chaos Mesh 实践经验(持续更新)
使用 k8s JVM故障 Linux内核版本 Linux 系统内核必须为 4.1 及以上版本。 不然会一直失败,可以从Chaos Mesh dashboard前端看到。 对native方法注入故障无效 实测对Thread.sleep(Long) 注入故障无效,猜测是因为对native方法无效,大概因为…...

追梦之旅【数据结构篇】——详解C语言实现链栈
详解C语言实现链栈~😎前言🙌整体实现内容分析💞1.头文件编码实现🙌2.功能文件编码实现🙌3.测试函数功能代码🙌总结撒花💞😎博客昵称:博客小梦 😊最喜欢的座右…...

oracle数据库常用操作
1.连接登录切换用户su - oracle以管理员模式登录到sqlplus:sqlplus / as sysdba oracle登录身份有三种:1.1Normal 普通身份;1.2.sysdba 系统管理员身份;若以 ‘sysdba’ 方式认证,登录用户为 ‘SYS’,为 Or…...

一文教会你如何在Linux系统中使用Docker安装Redis 、以及如何使用可视化工具连接【详细过程+图解】
文章目录1、安装redis2、在外部创建配置文件3、创建redis4、启动测试redis5、数据持久化存储6、使用可视化工具连接redis前言在windows上安装过reids、在linux上也安装过redis,但是都没有docker上安装redis方便。这里给出docer安装redis的相关教程1、安装redis 默认…...

mysql 内存架构
1. 背景 从 innodb 的整体架构中可以知道 innodb 的内存架构中分为 buffer pool 缓存区, change pool 修改缓冲区, adaptive hash index 自适应哈希索引, 和 log buffer 日志缓冲区. 2. buffer pool buffer pool 是用于缓冲磁盘页的数据,mysql 的80%的内存会分配给…...

Helm安装Harbor
一、介绍 1.1 Harbor Harbor 是由 VMware 公司为企业用户设计的 Registry Server 开源项目,包括了权限管理 (RBAC)、LDAP、审计、管理界面、自我注册、HA 等企业必需的功能,同时针对中国用户的特点,设计镜像复制和中文支持等功能。目前该项…...

梯度下降优化器:SGD -> SGDM -> NAG ->AdaGrad -> AdaDelta -> Adam -> Nadam -> AdamW
目录 1 前言 2 梯度概念 3 一般梯度下降法 4 BGD 5 SGD 6 MBGD 7 Momentum 8 SGDM(SGD with momentum) 9 NAG(Nesterov Accelerated Gradient) 10 AdaGrad 11 RMSProp 12 Adadelta 13 Adam 13 Nadam 14 AdamW 15 Lion(EvoLve…...

Ubuntu下gcc多版本管理
Ubuntu下多gcc版本的管理 开发过程中,在编译一个开源项目时,由于代码使用的c版本过高,而系统内置的gcc版本过低时,这个时候我们就需要升级gcc版本,但是为了避免兼容性问题,安装多个版本的gcc,然…...

吃透8图1模板,人人可以做架构
前言 在40岁老架构师 尼恩的读者交流群(50)中,很多小伙伴问尼恩: 大佬,我们写架构方案, 需要从哪些方面展开 大佬,我们写总体设计方案需要一些技术亮点,可否发一些给我参考下 诸如此类,问法很多…...

骨传导耳机推荐哪款好,列举几款是市面上热销的骨传导耳机
骨传导耳机是一种新型的耳机类型,通过震动和声音将振动传到了耳道外,对耳道不会产生损伤,能够保护听力。相比于传统耳机的优势有很多,比如运动时佩戴更加稳固,也可以在听歌时与人交谈。但在市面上的骨传导耳机款式可…...

CFS三层内网渗透
目录 环境搭建 拿ubuntu主机 信息收集 thinkphp漏洞利用 上线msf 添加路由建立socks代理 bagecms漏洞利用 拿下centos主机 msf上线centos 添加路由,建立socks代理 拿下win7主机 环境搭建 设置三块虚拟网卡 开启虚拟机验证,确保所处网段正确&a…...

SQL server设置用户只能访问特定数据库、访问特定表或视图
在实际业务场景我们可能需要开放单独用户给第三方使用,并且不想让第三方看到与业务不相关的表或视图,我们需要在数据库中设置一切权限来实现此功能: 1.设置用户只能查看数据库中特定的视图或表 1.创建用户名 选择默认数据库 服务器角色默认…...

linux:http服务器搭建及实验案例
目录准备工作http服务器各个配置文件大概说明实验1:访问不同ip获得不同网页实验2:同一ip访问不同端口获得不同网页准备工作 1,安装http服务 2,将 /etc/selinux/config 文件下面的 SELINUX值改为 disabled 或者 permissive 。 3&a…...

【无标题】智能工业安全用电监测与智慧能源解决方案
工业互联网已成为全球制造业发展的新趋势。在新基建的推动下,5G、人工智能、云计算等技术与传统工业深度融合,为实现智能制造提供了技术支撑,将有力促进制造强国早日实现。 十四五规划在新基建的基础上进一步加快了制造业转型升级的步伐&…...

前端白屏的检测方案,让你知道自己的页面白了
前言 页面白屏,绝对是让前端开发者最为胆寒的事情,特别是随着 SPA 项目的盛行,前端白屏的情况变得更为复杂且棘手起来( 这里的白屏是指页面一直处于白屏状态 ) 要是能检测到页面白屏就太棒了,开发者谁都不…...

编译原理【文法设计】—每个a后面至少一个b、ab个数相等,ab个数不相等的所有串
编译原理【文法设计】—设计每个a后面至少一个b、ab个数相等,ab个数不相等的文法为字母表Σ{a,b}Σ\{a,b\}Σ{a,b}上的下列每个语言设计一个文法 (a) 每个a后面至少有一个b的所有串 首先,每个a后面至少有一个b的正规式怎么写呢?每个a都需要…...

【死磕数据库专栏启动】在CentOS7中安装 MySQL5.7版本实战
文章目录前言实验环境一. 安装MySQL1.1 配置yum源1.2 安装之前的环境检查1.3 下载MySQL的包1.4 开始使用yum安装1.5 启动并测试二. 设置新密码并重新启动2.1 设置新密码2.2 重新登录测试总结前言 学习MySQL是一件比较枯燥的事情,学习开始之前要先安装MySQL数据库&a…...

23.2.23 22湖北省赛 B
好久没打卡了, 随便找的个水题写 这题是简单难度的 ab1 所以可以找到固定规律, 通过手动模拟可以发现 假设两种水叫做a水和b水 先倒入a水 1:0 倒入b水 1:1 此时水杯为 倒出一半的混合物, 因为ab水互溶, 比例不变 再加入a水或者b水将容器填满 比例现在变为 3:1 混合之后再…...

ONLYOFFICE中的chatGPT 是如何编写毕业论文以及翻译多种语言的
前言 chatGPT这款软件曾被多个国家的大学禁用,我们也多次在网上看到chatGPT帮助应届毕业生编写毕业答辩论文,但是这款软件目前还没有在国内正式上线,ONLYOFFICE7.3版本更新后呢,就添加了chatGPT该功能,并且正常使用。 …...