当前位置: 首页 > news >正文

【Git版本控制器--1】Git的基本操作--本地仓库

目录

初识git 

本地仓库

认识工作区、暂存区、版本库

add操作与commit操作 

master文件与commit id

修改文件

版本回退 

撤销修改 

删除文件


初识git 

Git 是一个分布式版本控制系统,主要用于跟踪文件的更改,特别是在软件开发中。


为什么要版本控制?

需求:假设你的导师让你为一件产品写出一份文档。

当你写完以后,你拿给你的导师,你的导师并不满意,让你拿回去进行修改。此时你不进行版本控制,直接在原文档上进行修改,最终你改完以后又拿给你的导师,你的导师还是不满意。以此往复,你对原文档进行了10多次的修改,而此时你的导师又改主意了,让你拿出第一次修改后的文档,你该怎么办呢?

若是不进行版本控制,那么上述问题是无解的,因为你是直接对原文档进行的修改!

所谓的版本控制,就是让你有方式对自己修改的每一份代码都有备份!版本控制器的核心功能就是对这些备份进行管理。

版本控制器的本质就是记录每次的修改以及版本迭代的一个管理系统

git是目前最主流的版本控制器!git可以控制电脑上所有格式的文档。对于开发人员来说,git最主要的作用是可以用来管理源代码文件

  • 对于文本文件来说,文件每一次上传到git,git都会记录你本次修改的内容,如:第二行新增了xxx
  • 对于二进制文件来说,git并不会记录它修改的内容,只会记录文件大小的变化 

本地仓库

为什么要有本地仓库? 

git是用于管理我们的文件的一个版本控制器,如果文件被分散在电脑的各个角落,git是无法进行管理的,所以git管理文件要求我们的文件必须是放在git仓库中的 


如何创建本地仓库

第一步:需要创建一个目录

第二步 :在创建好的目录中使用如下指令

git init

输入完上述指令以后,会发现我们的目录下多了一个.git文件

这个文件是.git文件是git提供用于追踪并管理我们仓库的文件,一般来说不要手动修改.git中的内容


如何配置本地仓库?

配置本地仓库时,最主要配置的两个信息:

  • name
  • email

若不配置上述两个信息,git会报错

配置用户名称:

git config user.name "[用户名称]"

例如:

[yyf@VM-24-5-centos gitcode]$ git config user.name "yyf"

配置email邮箱地址:

git config user.email "[邮箱地址]"

 例如:

[yyf@VM-24-5-centos gitcode]$ git config user.email "123123@qq.com"

 查看配置信息:

git config -l

 删除配置信息:

git config --unset [键值]

键值:user.name、user.email都是键值,查看配置信息时"="左边的都是键值

例如:

 一个主机当中,可以存在很多个本地仓库。并且我们可以一次设置所有本地仓库的配置信息

设置全局配置信息:

git config --global [配置键值] "[配置值]"

例如:

git config --global user.email "123123123@qq.com"

删除全局配置信息:

git config --global --unset [配置键值]

认识工作区、暂存区、版本库

 

如图,在包含.git文件的gitcode目录下我创建了一个ReadMe文件

但实际上这个文件并不能被git管理。这是因为gitcode文件并不是真实的git仓库。

真正的git仓库是.git文件

.git文件又被称为版本库/仓库!

虽然.git是仓库,但不能直接手动修改.git中的内容,这是不被允许的!

由于.git不能直接被修改,所以一般我们把要被管理的文件放在包含.git文件的目录下(图上gitcode)。而这个目录我们又称之为工作区!

注意:.git文件虽然是在工作区目录下,但.git文件不属于工作区


如何把工作区文件放到版本库中,使git能管理该文件? 

  • stage我们称之为暂存区/索引
  • 图中其他概念,后面会阐述
  • 如图所示,把工作区的所有修改内容添加到版本库中,是通过add操作实现的
  • 修改内容:在工作区中创建文件、修改工作区的文件、在工作区的删除操作
  • 注意:add操作是把工作区的内容放入到版本库的暂存区当中
  • 把暂存区的内容放入到master中,是通过commit操作实现的!
  • 当工作区的修改内容被commit到master以后,才真正意味着该内容被添加进了版本库中!

git的版本控制如何体现? 

版本库中除了暂存区与master以外还会存在一个objects,即对象区 

 

而我们每次在工作区中add一个修改内容时,都会新增一个修改内容的git对象,该对象会被维护到objects中 

所以我们每次修改工作区的内容并生成一个新的git对象被维护到objects对象区中时,就相当于我们维护了一个版本!

暂存区和对象区之间的关系:

  • objects对象区是实际存储修改内容对象的地方!
  • stage暂存区是存储对象区的索引,所以一般来说stage都是较为轻量级的

commit操作做了什么?

  • commit操作实际上就是把暂存区中的索引树,放入到master区
  • 所以master区中存储的也是对象在对象区的索引,master区也是较为轻量级的 

 HEAD是一个指针,它指向了master区,我们只要拿到HEAD指针就能拿到master的那棵索引数

注意:有了HEAD指针就能找到master指针,所以版本库中并没有master区 


add操作与commit操作 

add/commit...操作对应的Linux命令 

add操作:git add [file1] [file2] ...

commit操作:git commit -m "message"  (message:本次提交的描述信息!)

如下:

我们在commit时,可以看到git的管理信息,即一个文件被改变,增加了1行 

获取工作区的所有的提交记录:

git log

  • commit:即commit id,每一次提交时生成git对象的commit id都不同,它是通过某种哈希算法得到的!
  • Author:表示提交的人是谁,我们之前配置的name和email都会显示在这
  • Date:提交日期 

若上述的获取提交记录的方法,你觉得内容太多不好筛选,那么可以带上如下选项:

git log --pretty=oneline

 

 带上选项以后,只打印commit id和描述信息!


master文件与commit id

之前说过HEAD指针是指向master的,所以HEAD中保存了master的地址

我们会发现master文件中存储的实际上就是最近一次提交的commit id

之前说过commit id可以标识git对象,若我们拿着这个commit id那么就能到objects对象区中找到该对象!

找之前我们得先把commit id分为两个部分,最开始得两位数表示得是文件夹的名称,而其他位数表示的是文件的名称


如何查看git对象的内容 

查看git对象的内容:

git cat-file -p [commid id]

输入上述查看git对象后,我们能看到的内容:

  • parent:表示上一次提交时的commit id
  • tree:Git 中的一个基本对象,表示某个特定目录的结构。它包含了文件和子目录的信息。通过tree的commit id我们能查看到修改后的文件内容

修改文件

git追踪管理的其实是修改,而不是文件!

通过如下指令,可以查看是否有对暂存区的修改

git status

 

可以看到,若我仅仅是对工作区内容进行了修改,那么它会提示暂存区中的数据没有被修改!并且也会提示被修改的文件是在工作区被修改的,即modified:ReadMe(工作区中的ReadMe文件被修改)

status仅仅能表示该文件内容是否被修改,但不清楚具体修改了什么内容

Linux中可以查看暂存区和工作区之间内容的差异:

git diff [文件名]

 


版本回退 

什么是版本回退?

Git版本回退是指在Git版本控制系统中,将代码库的状态恢复到先前的某个提交。这个操作通常用于撤销不想要的更改、修复错误或查看历史版本。

例如:

我们git在提交version0版本时,只有一行hello,world。

之后的version1版本,我们添加了一行hello,git。此时version1中有两行的内容

通过版本回退我们能拿到version0,即只有一行hello,world时的样子


如何版本回退? 

Git版本回退我们采用如下指令:

git reset [选项] [commit id]

reset进行版本回退时,本质是回退版本库中的内容 

若需要回退工作区以及暂存区的内容,那么需要我们为上述指令添加上选项

reset一共有三个选项:

  • --soft
  • --mixed
  • --hard 

若我们reset时选择--soft选项,那么版本回退只回退的是版本库中的内容,对于工作区以及暂存区是不进行回退的 

若我们reset时选择--mixed选项,那么版本回退时既回退版本库中的内容,还会回退暂存区的内容,但工作区不会进行版本回退

若我们reset时选择--hard选项,那么版本回退时工作区、暂存区、版本库都会进行版本回退


表格示例 

假设我们version0版本时,文件内容为git。version1版本时,文件内容添加了 world。那么对于该文件遵循如下表格 

工作区暂存区版本库
不进行resetgit worldgit worldgit world
--softgit worldgit worldgit
--mixedgit worldgitgit
--hardgitgitgit

版本回退时的注意事项 

对于--hard选项,我们需要谨慎使用!

  • --hard选项,会回退工作区的内容,这意味着,假设有人在工作区中进行开发。那么开发的代码会直接被回退掉!

版本回退演示 

进行版本回退时,我们需要知道之前版本的commit id

如下图:我首先完成version0版本的提交

如下图:我完成了version1版本的提交

首先是进行版本回退之--hard的测试

如图我们会发现,testgit文件不见了,因为我们回退的版本是最先一次提交的版本,--hard选项直接把我们的工作区也回退了

如果后悔了怎么办?

只要有commit id,再次进行hard回退即可,如下:

我回退的是version1版本,此时能看到文件内容又被回退回来了!

但这种后悔药仅仅是因为我提前知道,所以提前git log获取了commit id。若我们把服务器关了,或者屏幕清了,如何能恢复呢?

使用git reflog指令可以查看到本地每一次提交时的记录

红框中的就是commit id,严格来说是commit id的一部分,但我们仍然可以使用这个commit id的一部分进行版本回退!

如下:

需要注意的是:由于实际开发中经常使用git操作,所以这些commit id不是一直保存的,系统可能会自动清理掉一些commit id,若commit id被清理,那么就没有后悔药可以吃了,所以如果发生误回退行为,请尽快操作!


原理 

 

如图所示,版本库中的objects对象区中会管理git对象,而所谓的版本回退就是让master指针从一个git对象指向前一个git对象。整个过程只需要改变指针的指向,所以回退操作一般是非常快的 


撤销修改 

什么时候需要撤销修改? 

如果我们在我们的工作区中写了很长时间代码,越写越写不下去,觉得自己写的实在是垃圾,想恢复到上一个版本

此时根据不同情况,我们可以采取不同的恢复策略

注意:以下聊的撤销修改指的是期望工作区、暂存区、版本库中都撤销修改!并且如下撤销都是基于没有进行push操作(推送到远程仓库)的前提下!


第一种情况:对于工作区的代码,还没有add操作 

我们期待的结果是工作区的代码都进行撤销

对于这种情况,我们有三种解决方式:

  • 手动修改(不推荐),容易手动改出bug
  • git checkout -- [文件名]
  • reset进行版本回退,之前说过不再赘述

对于git checkout --来说,就是回退到文件最近一次提交时的样子!其中"--"是非常重要的,若不带上"--"那么该指令是另外的含义!

如下示例:


第二种情况:已经进行add添加到了暂存区当中,但还没有commit 

我们期待的是工作区与暂存区的代码都进行撤销

对于这种情况我们有两种解决方案:

  • 使用reset带上--hard选项一步到位直接到最近一次提交的样子
  • 使用reset带上--mixed选项转化为第一种情况的样子

hard我们之前已经详细使用过,接下来我们使用mixed进行回退

mixed是默认选项,不需要显示写都可以!

同时我们不需要再去找commit id了

  • 若我们需要回退到当前版本,那么commit id可以替换为HEAD
  • 若我们需要回退到上一个版本,那么commit id可以替换为HEAD^
  • 若我们需要回退到上一个版本,那么commit id可以替换为HEAD^^
  • 以此类推....
  • 这种方式也适用于--hard和--soft选项

 


第三种情况:工作区、暂存区、版本库中都已经添加了修改内容 

 参考第二种情况!


删除文件

对于工作区的文件,直接使用rm指令删除即可

对于既在工作区,又在暂存区的文件,又或者在版本库中的文件,git中提供了rm方式删除文件,git中的rm和删除工作区的rm的区别在于git提供的rm既会删除工作区中该文件,又会删除暂存区中该文件,使用了git rm后,我们直接提交一次即可

如下示例:

相关文章:

【Git版本控制器--1】Git的基本操作--本地仓库

目录 初识git 本地仓库 认识工作区、暂存区、版本库 add操作与commit操作 master文件与commit id 修改文件 版本回退 撤销修改 删除文件 初识git Git 是一个分布式版本控制系统,主要用于跟踪文件的更改,特别是在软件开发中。 为什么要版本…...

C++并发编程之无锁数据结构及其优缺点

在C并发编程中,无锁数据结构(Lock-free Data Structures)是指那些在实现中不使用互斥锁(如std::mutex)来保证线程安全的数据结构。相反,它们利用原子操作和内存模型来确保多线程环境下的正确性和高效性。下…...

Ubuntu上,ffmpeg如何使用cuda硬件解码、编码、转码加速

本文使用 Ubuntu 环境。Ubuntu 直接使用 APT 安装的就支持 CUDA 加速。本文使用这样下载的版本进行演示,你自己编译或者其他源的版本可能会不同。 ffmpeg 的一些介绍,以及 macOS 版本的 ffmpeg 硬件加速请见《macOS上如何安装(不需要编译安装…...

rclone,云存储备份和迁移的瑞士军刀,千字常文解析,附下载链接和安装操作步骤...

一、什么是rclone? rclone是一个命令行程序,全称:rsync for cloud storage。是用于将文件和目录同步到云存储提供商的工具。因其支持多种云存储服务的备份,如Google Drive、Amazon S3、Dropbox、Backblaze B2、One Drive、Swift、…...

Ubuntu | 系统软件安装系列指导说明

文章目录 Ubuntu 系统软件安装系列指导说明工具系列1. Docker 与 Docker-Compose部署与安装 环境系列1. Golang部署与安装 数据库系列1. PostgreSQL17.2源码部署与安装 Ubuntu 系统软件安装系列指导说明 工具系列 1. Docker 与 Docker-Compose部署与安装 链接 环境系列 1…...

队列(算法十三)

简介 几乎没有单纯之考察队列的&#xff0c;队列一般只作为一个辅助工具 队列常服务于BFS queue接口 1.N叉树的层序遍历 link: 思路&#xff1a; 队列 层序遍历即可 code /* // Definition for a Node. class Node { public:int val;vector<Node*> children;Node()…...

vLLM私有化部署大语言模型LLM

目录 一、vLLM介绍 二、安装vLLM 1、安装环境 2、安装步骤 三、运行vLLM 1、运行方式 2、切换模型下载源 3、运行本地已下载模型 四、通过http访问vLLM 一、vLLM介绍 vLLM&#xff08;官方网址&#xff1a;https://www.vllm.ai&#xff09;是一种用于大规模语言模型&#x…...

OpenAI Whisper:语音识别技术的革新者—深入架构与参数

当下语音识别技术正以前所未有的速度发展&#xff0c;极大地推动了人机交互的便利性和效率。OpenAI的Whisper系统无疑是这一领域的佼佼者&#xff0c;它凭借其卓越的性能、广泛的适用性和创新的技术架构&#xff0c;正在重新定义语音转文本技术的规则。今天我们一起了解一下Whi…...

基于当前最前沿的前端(Vue3 + Vite + Antdv)和后台(Spring boot)实现的低代码开发平台

项目是一个基于当前最前沿的前端技术栈&#xff08;Vue3 Vite Ant Design Vue&#xff0c;简称Antdv&#xff09;和后台技术栈&#xff08;Spring Boot&#xff09;实现的低代码开发平台。以下是对该项目的详细介绍&#xff1a; 一、项目概述 项目名称&#xff1a;lowcode-s…...

【Rust】错误处理机制

目录 思维导图 引言 一、错误处理的重要性 1.1 软件中的错误普遍存在 1.2 编译时错误处理要求 二、错误的分类 2.1 可恢复错误&#xff08;Recoverable Errors&#xff09; 2.2 不可恢复错误&#xff08;Unrecoverable Errors&#xff09; 三、Rust 的错误处理机制 3…...

Logback日志技术

Logback日志技术 日志 日志&#xff08;Logging&#xff09;是软件开发和运维中用于记录系统或应用程序运行期间发生的运行信息、状态变化、错误信息等的一种机制&#xff0c;这种记录的方式就好像我们日常生活中写日记一样。它提供了一种持久化的方式&#xff0c;使得开发者…...

9分布式微服务架构

分布式微服务架构不光需要从架构上的设计优化系统&#xff0c;还要在编码上优化达到最好的效果 中心化的设计 中心化的设计比较简单&#xff0c;分布式集群中的角色分为两种&#xff0c;管理者和被管理者。 在一个分布式或者集群中&#xff0c;管理者角色管理着其他处理实际…...

Leecode刷题C语言之统计重新排列后包含另一个字符串的子字符串数目②

执行结果:通过 执行用时和内存消耗如下&#xff1a; void update(int *diff, int c, int add, int *cnt) {diff[c] add;if (add 1 && diff[c] 0) {// 表明 diff[c] 由 -1 变为 0(*cnt)--;} else if (add -1 && diff[c] -1) {// 表明 diff[c] 由 0 变为 -…...

HTML和CSS相关的问题,为什么页面加载速度慢?

页面加载速度慢是网站优化中一个常见的问题&#xff0c;可能由于多种原因&#xff0c;包括HTML和CSS的代码编写方式、资源的加载顺序、页面渲染的复杂性等。以下是一些常见的原因和优化方法&#xff0c;结合实际项目代码示例进行讲解。 1. 过多的资源请求 如果页面包含大量的…...

LiveGBS流媒体平台GB/T28181常见问题-没有收到视频流播放时候提示none rtp data receive未收到摄像头推流如何处理?

LiveGBS没有收到视频流播放时候提示none rtp data receive未收到摄像头推流如何处理&#xff1f; 1、none rtp data receive2、搭建GB28181视频直播平台 1、none rtp data receive LiveSMS 收不到下级推流 首先需要排查服务器端 UDP & TCP 30000-30249 端口是否开放其次排…...

Flask表单处理与验证

Flask是一个轻量级的Python框架&#xff0c;它通过扩展库提供了对表单处理与验证的支持。WTForms是一个流行的Flask扩展库&#xff0c;用于创建和验证Web表单。它提供了一种声明式的方法来定义表单结构和验证逻辑&#xff0c;使得表单处理更为简洁和优雅。下面&#xff0c;我们…...

正泰电工携手图扑:变电站数字孪生巡检平台

随着电力行业的快速发展与智能化转型&#xff0c;传统的人工巡检方式难以匹配现代电网对于效率、安全和精细化管理的高标准要求。在此背景下&#xff0c;构建智慧变电站巡检系统已成为推动变电站智能化进程、实现高效运营和保障电网可靠性的重要战略。 图扑软件与正泰电工联合…...

瑞芯微 RK 系列 RK3588 使用 ffmpeg-rockchip 实现 MPP 视频硬件编解码-代码版

前言 在上一篇文章中&#xff0c;我们讲解了如何使用 ffmpeg-rockchip 通过命令来实现 MPP 视频硬件编解码和 RGA 硬件图形加速&#xff0c;在这篇文章&#xff0c;我将讲解如何使用 ffmpeg-rockchip 用户空间库&#xff08;代码&#xff09;实现 MPP 硬件编解码。 本文不仅适…...

uniapp 预加载分包,减少loading

在 uniapp 中&#xff0c;可以通过配置 pages.json 文件中的 preloadRule 属性来实现页面预加载功能。以下是具体操作步骤&#xff1a; 1. 在 pages.json 中配置 preloadRule preloadRule 用于指定哪些页面需要预加载&#xff0c;以及预加载时机。下面是一个示例配置&#xf…...

c#删除文件和目录到回收站

之前在c上遇到过这个问题&#xff0c;折腾许久才解决了&#xff0c;这次在c#上再次遇到这个问题&#xff0c;不过似乎容易了一些&#xff0c;亲测代码如下&#xff0c;两种删除方式都写在代码中了。 直接上完整代码&#xff1a; using Microsoft.VisualBasic.FileIO; using Sy…...

Windows 系统安装 Redis 详细教程

Windows 系统安装 Redis 详细教程 一、Redis 简介 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、基于内存的高性能键值存储系统&#xff0c;常被用作数据库、缓存和消息中间件。相比传统数据库&#xff0c;Redis 具有以下优势&#xff1a; 超高性能…...

智能标志桩图像监测装置如何守护地下电缆安全

在现代城市基础设施建设中&#xff0c;大量电缆、管道被埋设于地下&#xff0c;这虽然美化了城市景观&#xff0c;却也带来了新的安全隐患。施工挖掘时的意外破坏、自然灾害的影响&#xff0c;都可能威胁这些"城市血管"的安全运行。 传统的地下设施标识方式往往只依…...

阿里云ACP云计算备考笔记 (4)——企业应用服务

目录 第一章 企业应用概览 第二章 云解析 1、云解析基本概念 2、域名管理流程 3、云解析记录类型 4、域名管理 ① 开启注册局安全锁 ② 域名赎回 第二章 内容分发网络CDN 1、CDN概念 2、使用CDN前后对比 3、使用CDN的优势 4、阿里云CDN的优势 5、配置网页性能优化…...

【C语言】通用统计数据结构及其更新函数(最值、变化量、总和、平均数、方差等)

【C语言】通用统计数据结构及其更新函数&#xff08;最值、变化量、总和、平均数、方差等&#xff09; 更新以gitee为准&#xff1a; gitee 文章目录 通用统计数据结构更新函数附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压缩Packed-ASCII字符串 大小端转换什…...

Android Test3 获取的ANDROID_ID值不同

Android Test3 获取的ANDROID_ID值不同 这篇文章来说明上一篇文章中说到的一个现象&#xff1a;在同一个项目中&#xff0c;创建不同的 app module&#xff0c;运行同一段测试代码&#xff0c;获取到的 ANDROID_ID 的值不同。 我也是第一次认真研究这个现象&#xff0c;这个还…...

阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库

阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库 最近帮朋友 完成一些运维工作 &#xff0c;这里记录一下。 文章目录 阿里云 RDS mysql 5.7 怎么 添加白名单 并链接数据库最近帮朋友 完成一些运维工作 &#xff0c;这里记录一下。 阿里云 RDS MySQL 5.7 添加白名单1. 登录…...

蓝桥杯单片机之通过实现同一个按键的短按与长按功能

实现按键的短按与长按的不同功能 问题分析 对于按键短按&#xff0c;通常是松开后实现其功能&#xff0c;而不会出现按下就进行后续的操作&#xff1b;而对于按键长按&#xff0c;则不太一样&#xff0c;按键长按可能分为两种情况&#xff0c;一是长按n秒后实现后续功能&…...

并发编程实战(生产者消费者模型)

在并发编程中使用生产者和消费者模式能够解决绝大多数的并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序整体处理数据的速度。 生产者和消费者模式&#xff1a; 在线程的世界中生产者就是产生数据的线程&#xff0c;而消费者则是消费数据的线程。在多线程开…...

【Android基础回顾】五:AMS(Activity Manager Service)

Android 的 AMS&#xff08;Activity Manager Service&#xff09;是 Android 系统中的核心服务之一&#xff0c;负责管理整个应用生命周期、任务栈、进程和四大组件&#xff08;Activity、Service、BroadcastReceiver、ContentProvider&#xff09;的运行。它运行在系统进程 s…...

CRMEB 中 PHP 快递查询扩展实现:涵盖一号通、阿里云、腾讯云

目前已有一号通快递查询、阿里云快递查询扩展 扩展入口文件 文件目录 crmeb\services\express\Express.php 默认一号通快递查询 namespace crmeb\services\express;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use think\Container; use thi…...