Git的原理与使用(一)
目录
Git初始
Git安装
Git基本操作
创建git本地仓库
配置git
工作区,暂存区,版本库
添加文件,提交文件
查看.git文件
修改文件
版本回退
小结
Git初始
git是一个非常强大的版本控制工具.可以快速的将我们的文档和代码等进行版本管理.
下面这个实例看理解下为什么需要版本控制
在工作或者学习中,我们可能经常会遇到这样的场景,例如当我们需要给领导提供一份资料的时候,我们先写出了一个版本,交给领导,但是领导看完不满意,让重新写,于是我们又写了第二个版本,领导还是不满意,于是又写了第三个版本,领导看完之后说还不如第二个版本的文档,于是就要第二个版本的文档.
这种情况下我们想要恢复到第二个版本的文档是不是就比较麻烦了.
但是如果我们将文档交给git进行管理之后,那个问题就不在是问题了.
对于Git这个工具,不管是在企业中还是学习中,适用频率都是很高的一个工具,在企业中我们需要合作开发项目,那么合作完成项目,git是必不可少的一个工具.
Git安装
工欲善其事必先利其器,接下来我们先安装git.
我们安装git环境是在CentOs.
后续的操作也是在CentOS上进行操作.
由于我们的系统上是没有git的,我们需要安装git.
在没有安装git之前,我们在控制台上输入git之后,会出现这样的场景:
git
-bash: git: command not found
上述情况只是系统提示我们没有安装git.
其实在linux上安装git非常简单,只需要一个命令即可:
yum -y install git
当操作这个命令之后,我们可以在控制台输入 git --version来查看我们安装的版本.
目前为止我们的git已经安装完成了.可以看出git的安装是非常简单的,可以说是傻瓜式安装.
Git基本操作
接下来我们将介绍git的一些基本操作.这些基本操作一般使用频率最高.
创建git本地仓库
上述图片中的命令就是在我们本地创建一个新的git仓库.
git init 命令就是创建本地仓库的命令.
当我们创建完成之后,我们在当前仓库发现了一个.git的隐藏目录.这个目录就是用来管理这个仓库下的所有东西的.
以下就是.git目录下的所有东西.
关于这个.git目录中的东西我们在后面会详细进行介绍.
配置git
接下来就需要对git进行配置,这个配置是非常重要的,主要就是配置用户名和email地址,这个配置用来区分是那个用户进行提交的.
配置命令:
git config user.name "Your Name"
git config user.email "email@example.com"
需要把user.name和user.email 换成自己的即可.
可以使用git config -l进行查看
--global 是⼀个可选项。如果使⽤了该选项,表⽰这台机器上所有的 Git 仓库都会使⽤这个 配置。如果你希望在不同仓库中使⽤不同的 name 或 e-mail ,可以不要 --global 选项,但要 注意的是,执⾏命令时必须要在仓库⾥。
删除对应的配置命令:
git config --unset user.namegit config --unset user.email
如果需要删除全局的配置,只需要将 --global选项即可.
工作区,暂存区,版本库
工作区:工作区就是在git仓库下进行编写代码和文档的地方.
暂存区:英⽂叫 stage 或 index。⼀般存放在 .git ⽬录下的 index ⽂件(.git/index)中,我们 把暂存区有时也叫作索引(index)。
版本库:⼜名仓库,英⽂名 repository 。⼯作区有⼀个隐藏⽬录 .git ,它不算⼯作区,⽽ 是 Git 的版本库。这个版本库⾥⾯的所有⽂件都可以被 Git 管理起来,每个⽂件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
图中左侧为⼯作区,右侧为版本库。
Git 的版本库⾥存了很多东西,其中最重要的就是暂存区。
在创建 Git 版本库时,Git 会为我们⾃动创建⼀个唯⼀的 master 分⽀,以及指向 master 的⼀个指 针叫 HEAD。(分⽀和HEAD的概念后⾯再说)
当对⼯作区修改(或新增)的⽂件执⾏ git add 命令时,暂存区⽬录树的⽂件索引会被更新。
当执⾏提交操作 git commit 时,master 分⽀会做相应的更新,可以简单理解为暂存区的⽬录树才会被真正写到版本库中。
由上述描述我们便能得知:通过新建或粘贴进⽬录的⽂件,并不能称之为向仓库中新增⽂件,⽽只是在⼯作区新增了⽂件。必须要通过使⽤ git add 和 git commit 命令才能将⽂件添加到仓库中 进⾏管理!!!
添加文件,提交文件
我们在包含.git目录的下新建一个文件,我们可以使用git add 命令将工作区的文件添加到暂存区.
- 添加一个或多个文件到暂存区 git add [file1] [file2] ...
- 添加一个目录到暂存区 git add [dir]
- 添加当前目录下所用改动的文件到暂存区 git add
再使用git commit命令将暂存区中的文件提交的本地仓库中.
- 提交暂存区全部内容到本地仓库中: git commit -m "message"
- 提交暂存区的指定⽂件到仓库区: git commit [file1] [file2] ... -m "message"
注意:git commit -m选项要跟上这次提交的描述信息.这个不能缺少.用来记录你提交的细节,要好好描述.
[root@VM-8-9-centos TestGit]# git init
初始化空的 Git 版本库于 /root/TestGit/.git/
[root@VM-8-9-centos TestGit]# ls -a
. .. .git
[root@VM-8-9-centos TestGit]# touch 1.txt
[root@VM-8-9-centos TestGit]# touch 2.txt 3.txt
[root@VM-8-9-centos TestGit]# ls
1.txt 2.txt 3.txt
[root@VM-8-9-centos TestGit]# git add 1.txt
[root@VM-8-9-centos TestGit]# git add 2.txt 3.txt
[root@VM-8-9-centos TestGit]# git commit 1.txt -m "提交一个文件"
[master(根提交) da0d6e8] 提交一个文件1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 1.txt
[root@VM-8-9-centos TestGit]# git commit -m "将暂存区中所有文件都提交"
[master 890a29d] 将暂存区中所有文件都提交2 files changed, 0 insertions(+), 0 deletions(-)create mode 100644 2.txtcreate mode 100644 3.txt
[root@VM-8-9-centos TestGit]# ^C
[root@VM-8-9-centos TestGit]#
此时我们可以使用git log命令来查看提交记录:
该命令显示的是从进到远的日志.
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline 参数:
我们发现在上面都会有一些数字比如890a29.................,这个数字的话是我们每次进行提交的commit Id(版本号),git的commit id是通过一系列计算出来的16进制的数字.
要搞明白这些数字的含义,就需要进入.git目录.
查看.git文件
- index就是暂存区,我们进行add的文件和代码都是在这个目录下
- HEAD就是我们默认指向的master分支的指针
其实所谓的master分支就是: 可以看到master分支打印 了一串数字,其实这个数字就是我们最近提交的commit id
我们可以通过打印日志来看看:
[root@VM-8-9-centos TestGit]# git log --pretty=oneline
890a29d9bdb4b08ce1a6c62cb2f9686ca9c0e451 将暂存区中所有文件都提交
da0d6e8dbbda2503b782b862bb1d332dc2a6a5a1 提交一个文件
[root@VM-8-9-centos TestGit]#
可以看到完全一致.也就是说我们现在是将文档提交到master分支上的.
- objects 为 Git 的对象库,⾥⾯包含了创建的各种版本库对象及内容
当执⾏ git add 命令 时,暂存区的⽬录树被更新,同时⼯作区修改(或新增)的⽂件内容被写⼊到对象库中的⼀个新的对象中,就位于 ".git/objects" ⽬录下,让我们来看看这些对象有何⽤处.
我们发现里面有很多的目录,查找 object 时要将 commit id 分成2部分,其前2位是⽂件夹名称,后38位是⽂件名称。
找到这个⽂件之后,⼀般不能直接看到⾥⾯是什么,该类⽂件是经过 sha (安全哈希算法)加密过的 ⽂件,好在我们可以使⽤ git cat-file 命令来查看版本库对象的内容:
我们所有对本地仓库目录下的所有操作,都会被git记录下来,也就是在objects目录下,这里记录了所有对本地仓库的操作.
修改文件
Git ⽐其他版本控制系统设计得优秀,因为 Git 跟踪并管理的是修改,⽽⾮⽂件。
什么是修改?⽐如你新增了⼀⾏,这就是⼀个修改,删除了⼀⾏,也是⼀个修改,更改了某些字符, 也是⼀个修改,删了⼀些⼜加了⼀些,也是⼀个修改,甚⾄创建⼀个新⽂件,也算⼀个修改。
我们可以将我们前面提交的文件进行修改,
我们使用vim 1.txt打开文件,在里面写入hello world,然后保存退出.
此时,仓库中的1.txt文件和我们工作区的1.txt文件是不同的.我们可以使用git status命令查看在你上次提交之后是否有对⽂件进⾏再次修改
上述结果已经告诉我们了,1.txt已经被修改,但是还没有进行添加和提交.
此时我们是知道1.txt文件已经被修改了,但是并不知道修改了那些内容.我们可以使用命令:
git diff 1.txt 来查看修改了那些内容.
这里我们就能看到我们添加了一行hello world .
当我们知道我们修改了那些内容的时候,我们就可以进行添加和提交操作了.
当我们进行了add 之后再次查看的时候,就会发现他会提示你要提交的变更是那个了.然后我们进行提交就可以了.
版本回退
之前我们也提到过,Git 能够管理⽂件的历史版本,这也是版本控制器重要的能⼒。如果有⼀天你发现 之前前的⼯作做的出现了很⼤的问题,需要在某个特定的历史版本重新开始,这个时候,就需要版本回退的功能了。
执⾏ git reset 命令⽤于回退版本,可以指定退回某⼀次提交的版本。
要解释⼀下“回退”本质是 要将版本库中的内容进⾏回退,⼯作区或暂存区是否回退由命令参数决定:
git reset 命令语法格式为: git reset [--soft | --mixed | --hard] [HEAD]
- --mixed 为默认选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内 容,⼯作区⽂件保持不变。
- --soft 参数对于⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
- --hard 参数将暂存区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命 令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重。
- HEAD 说明:
可直接写成 commit id,表⽰指定退回的版本
HEAD 表⽰当前版本
HEAD^ 上⼀个版本
HEAD^^ 上上⼀个版本
以此类推...
可以使⽤ 〜数字表⽰:
HEAD~0 表⽰当前版本
HEAD~1 上⼀个版本
HEAD^2 上上⼀个版本
以此类推..
为了方便测试,我们对1.txt文件进行三次修改 添加 和提交操作.
第一次:
第二次:
第三次:
查看历史的提交记录:
现在,如果我们在提交完 version3 后, 发现 version 3 编写错误,想回退到 version2,重新基于 version 2 开始编写。由于我们在这⾥希望的是将⼯作区的内容也回退到 version 2 版本,所以需 要⽤到 --hard 参数,⽰例如下:
我们这里的回退是直接的commit Id进行回退的.
现在我们发现工作区的1.txt文件已经回退到了version2的版本了.同时也发现head已经指向了version2了
值得说的是,Git 的版本回退速度⾮常快,因为 Git 在内部有个指向当前分⽀(此处是master)的 HEAD 指针, refs/heads/master ⽂件⾥保存当前 master 分⽀的最新 commit id 。当我们 在回退版本的时候,Git 仅仅是给 refs/heads/master 中存储⼀个特定的version,可以简单理解 成如下⽰意图:
小结
本篇文章为git的基础篇,后续会持续更新git的其他操作以及高级的特性.
相关文章:

Git的原理与使用(一)
目录 Git初始 Git安装 Git基本操作 创建git本地仓库 配置git 工作区,暂存区,版本库 添加文件,提交文件 查看.git文件 修改文件 版本回退 小结 Git初始 git是一个非常强大的版本控制工具.可以快速的将我们的文档和代码等进行版本管理. 下面这个实例看理解下为什么需…...

1204. 错误票据
题目: 1204. 错误票据 - AcWing题库 思路: 将输入的数据存入数组,从小到大排序后遍历,若 (a[i] a[i - 1])res1 a[i]--->重号;若(a[i] - a[i - 1] > 2)res2 a[i] - 1--->断号。 难点:题目只告诉我们输入…...

uniapp中在组件中使用被遮挡或层级显示问题
uniapp中在组件中使用或croll-view标签内使用uni-popup在真机环境下会被scroll-view兄弟元素遮挡,在开发环境下和安卓系统中可以正常显示,但在ios中出现了问题 看了许多文章都没有找到问题的原因,最后看到这一个文章http://t.csdnimg.cn/pvQ…...

windows下安装es及logstash、kibna
1、安装包下载 elasticsearch https://www.elastic.co/cn/downloads/past-releases#elasticsearch kibana安装包地址: https://www.elastic.co/cn/downloads/past-releases/kibana-8-10-4 logstash安装包地址: https://www.elastic.co/cn/downloads/past…...

华为ensp:rip宣告
ip全部配置好 R1 进入r1视图模式 rip network 192.168.1.0 network 1.0.0.0 R2 进入r2视图模式 rip network 192.168.2.0 network 1.0.0.0 这样就完成了宣告 display ip routing-table 查看路由表...

Django中简单的增删改查
用户列表展示 建立列表 views.py def userlist(request):return render(request,userlist.html) urls.py urlpatterns [path(admin/, admin.site.urls),path(userlist/, views.userlist), ]templates----userlist.html <!DOCTYPE html> <html lang"en">…...
HCIE-Rainbow迁移工具
Rainbow迁移工具 Rainbow迁移工具支持p2v(物理机到虚拟机的迁移) v2v(虚拟机到虚拟机的迁移) Rainbow迁移是整机迁移,不会单独迁移上层的业务,也不会单独迁移数据,只会迁移整个虚拟机或者磁盘。…...

AI 绘画 | Stable Diffusion 涂鸦功能与局部重绘
在 StableDiffusion图生图的面板里,除了图生图(img2img)选卡外,还有局部重绘(Inpaint),涂鸦(Sketch),涂鸦重绘(Inpaint Sketch),上传重绘蒙版(Inpaint Uplaod)、批量处理(…...

[LeetCode周赛复盘] 第 371 场周赛20231112
[LeetCode周赛复盘] 第 371 场周赛20231112 一、本周周赛总结100120. 找出强数对的最大异或值 I1. 题目描述2. 思路分析3. 代码实现 100128. 高访问员工1. 题目描述2. 思路分析3. 代码实现 100117. 最大化数组末位元素的最少操作次数1. 题目描述2. 思路分析3. 代码实现 100124…...
Google Guava Cache LoadingCache 基本使用
一. 添加依赖 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>27.1-jre</version> </dependency>二. 创建CacheLoader LoadingCache<Long, String> cache CacheBuilder.newB…...

AWS云服务器EC2实例进行操作系统迁移
AWS云服务器EC2实例进行操作系统迁移 文章目录 AWS云服务器EC2实例进行操作系统迁移1. 亚马逊EC2云服务器简介1.2 亚马逊EC2云务器与弹性云服务器区别 2. 亚马逊EC2云服务器配置流程2.1 亚马逊EC2云服务器实例配置2.1.1 EC2实例购买教程2.1.1 EC2实例初始化配置2.1.2 远程登录E…...

《015.SpringBoot+vue之音乐网》【前后端分离】
《015.SpringBootvue之音乐网》【前后端分离】 项目简介 [1]本系统涉及到的技术主要如下: 推荐环境配置:DEA jdk1.8 Maven MySQL 前后端分离; 后台:SpringBootMybatisMySQL; 前台:Vue3.0 TypeScript Vue-Router Vuex Axios …...
网格算法和穷举法
介绍 网格算法和穷举法都是暴力搜索最优点的算法,在很多竞赛题中有应用,当重点讨论模型本身而轻视算法的时候,可以使用这种暴力方案,最好使用一些高级语言作为编程工具 当需要在多个离散的点(比如网格点)…...

【AI】自回归 (AR) 模型使预测和深度学习变得简单
自回归 (AR) 模型是统计和时间序列模型,用于根据数据点的先前值进行分析和预测。这些模型广泛应用于各个领域,包括经济、金融、信号处理和自然语言处理。 自回归模型假设给定时间变量的值与其过去的值线性相关,这使得它们可用于建模和预测时…...
安卓常见设计模式14------单例模式(Kotlin版)
1. W1 是什么,什么是单例模式? 单例模式属于创建型模式,旨在确保一个类只有一个实例,并提供一个全局访问点来获取该实例。单例模式的核心思想是限制类的实例化,使得系统中只有一个共享的实例。 2. W2 为什么&#…...
卡尔曼家族从零解剖-(06)一维卡尔曼滤波编程实践
讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的 卡尔曼家族从零解剖 链接 :卡尔曼家族从零解剖-(00)目录最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/133846882 文末正下方中心提供了本人 联系…...

macOS使用conda初体会
最近在扫盲测序的一些知识 其中需要安装一些软件进行练习,如质控的fastqc,然后需要用conda来配置环境变量和安装软件。记录一下方便后续查阅学习 1.安装miniconda 由于我的电脑之前已经安装了brew,所以我就直接用brew安装了 brew install …...
GetPrivateProfileSection使用
基本语法 GetPrivateProfileSection 是一个 Windows API 函数,用于检索指定 INI 文件中特定节的所有键值对。它可以读取INI文件中指定节所有的键值对并将结果存储在指定的缓冲区中。 以下是 GetPrivateProfileSection 函数的基本语法: DWORD GetPriva…...
Ubuntu20.04 安装 Matlab R2021a
1. 压缩包分卷解压缩 将下载下来的压缩包分卷解压缩 Ubuntu自带的archive会解压出错,不适用于分卷解压。 需要下载7zip (sudo apt-get install 走起) zip -F xxx.zip --out XXX.zip # xxx为主文件名 # XXX.zip为输出路径,上面的…...
让35岁程序员精力充沛的方法
最近重新阅读了《掌控:开启不疲惫、不焦虑的人生》这本书。这本书曾经对我减重20斤产生了巨大的影响。自然入睡、自然醒来,能够高效地工作和享受生活,这才是我们渴望的掌控感。以下是一些笔记: 少吃比多运动更有效地控制体重 每…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...