【Git】Git的基本操作
前言
Git是当前最主流的版本管理器,它可以控制电脑上的所有格式的文件。
它对于开发人员,可以管理项目中的源代码文档。(可以记录不同提交的修改细节,并且任意跳转版本)
本篇博客基于最近对Git的学习,简单介绍一下Git本地仓库的组成和基本操作(add、commit提交操作;log查看提交日志;reset回退版本等操作...)

注意:当前我使用的centos7.6 云服务器下演示。
一、Git的安装和本地仓库
1.git的安装和版本查看
通过代码:git --version 查看当前git版本,再决定是否进行安装。

如果没有就需要进行安装,在Linux下通过指令:sudo yum install -y git(默认当前你的用户存在管理员权限)

如上便就安装成功。
2.git本地仓库初始化与配置
我们需要对git创建一个专门的仓库,git才能对仓库下的文件进行版本管理,而不是对于任意的文件。这里的“仓库”自然指的就是文件夹了。
比如当前我创建一个test文件夹为git的本地仓库,进入test后,git就可以对其进行初始化和配置工作了。
命令:git init
初始化git仓库。
会以当前目录作为git的本地仓库,本地仓库下的文件可以收到git版本管理。
会新增隐藏文件夹.git。内部存在很多文件,它们是用来追踪管理Git仓库的,记住不可修改里面的内容。
现在,我在test文件夹内,执行此命令,可以看到隐藏文件夹,tree现实其目录树可以看到很多文件。(里面很多文件我们之后会讲到)


初始化后别忘了配置,git仓库存在一些配置:name和email,后续会用到:
命令:git config [--global] user.name "名字"、git config [--global] user.email "email地址"
配置git仓库的名字和email地址。
命令:git config -l
可以查看当前本地仓库的配置项目。
命令 git config [--global] --unset [user.name|...]
删除对应的config属性。
--global:
上述命令中的[--global]可选项表明全局属性,即在当前主机的所有git本地仓库生效,如果是对应的全局生效,那么unset重置时也需要加上全局属性。
这里随便配置一下用户为qihai,邮箱为123qihaiqaq@250.com(现编,和本篇博客后续操作无关)。

现在将qihai删除,换成QiHai:

现在试着将名字修改为qihai,全局模式设置,正常删除能删除么。

此时加上全局选项删除才有效,删除后在普通将配置项修改为qihai:

3.认识本地仓库中的工作区、暂存区、版本库
在具体操作git之前,我们需要认识工作区、暂存区、版本库这三个东西,后续我们操作的时候会更简单易懂的去理解。

可以看到,在Git下管理我们的文件,首先需要在工作区添加到暂存区(add),其次在将暂存区的内容添加到HEAD指向的master中(commit),此时我们的Git才真正管理了工作区中的文件。
我们每次修改的文件,当提交到版本库中时,Git都会为其维护一个git对象,并且放在了object对象库下,其他区域内存放的就是指针。那么何为修改呢?
对于修改的理解就是一切对文件改动的地方:
1.删除、创建
2.增加内容、删除内容
简而言之:新增、修改、删除被称作修改。
二、工作区文件提交到版本库管理
1.将工作区的文件添加到暂存区中
我们在当前Git本地仓库(工作区-除开.git文件外的地方)创建一个ReadMe文件,里面添加一行:Hello Git!
现在将它提交到暂存区中。
命令:git add 文件名1 文件名2 ...
这样可以批量或者单独添加一个多个文件到暂存区中去。
命令:git add .
.是当前目录下的一个隐藏文件.,表示此目录下的全体文件,这样就可以一次性将工作区的文件添加到暂存区中。

此时观察.git的目录可以发现已经创建出了index目录,说明已经为此次添加的工作区文件内容创建了git对象。

2.将暂存区内提交到HEAD指向的master中去
将暂存区提交到master中去,此时对应的文件成功被Git管理了起来。
命令:git commit -m "本次提交的细节内容"
将暂存区提交到版本库中去,此时文件被Git管理了起来。

3.打印从近到远的提交日志
我们可以打印出最近的提交日志。
命令:git log
打印出最近的Gitcommit提交日志。
命令:git log --pretty=oneline
打印一行漂亮可观的提交日志。

这里需要对日志中的内容进行阐释:
commit:是生成的hash-id,后续简称commit_id。
一个commit_id指向的是一个git对象,也就是在add后创建的此次修改的git对象,保存此次提交的工作区修改数据。
一个id,比如:96cbd6922eaa24d8a28a8756b90ecf55cc06c15e。其中前两位96表示在object下的文件夹名,而cbd6922eaa24d8a28a8756b90ecf55cc06c15e就是保存的对象名。
Author:为提交人的name和email。
Date:提交时间
下面的就是提交的细节信息
现在我在工作区新增三个文件:file1,file2,file3.我现在一次性添加到暂存区并且提交。

此时可以漂亮的打印日志查看:
可以看见,此时只是打印出了commit-id和提交的细节内容,可以更加方便的进行查看。
4.查看git对象中的内容
那么对于git对象我们可以查看吗?当然可以,Git为我们提供了查看对应commit-idGit对象的命令。
命令:git cat-file -p commit-id
-p是打印文件内容。
此命令就是显示对应commit-id的Git对象内容。
比如,现在我查看第一次提交的commit-id的内容:

就可以看到与这次提交的相关信息,其中,我们当前可以关心的是tree,tree里存放的commit-id就是这次我们实际修改的工作区文件内容:

5.提交与.git相关的细节内容
我们实际操作后其实关心的就是两个命令:add、commit。那么如何和我们的底层联系起来呢?
首先add操作后如果存在文件修改,那么会创建index作为暂存区,并且将工作区的内容提交到index中去。(之前add后展示的有)
那么现在从暂存区提交到HEAD中的指向区域,那么这个HEAD里到底是什么呢?

可以看到,HEAD当前的指向就是.git目录下的refs/heads/master。那么master中存储的是什么呢?

可以发现,master中存的就是最近一次的commit-id。对应的就是git文件,维护在Object对象库中的。
由此,我们可以简单总结一下:
index:暂存区,放add新增的内容。
head:指针,指向ref: refs/heads/master
master:存放的是最新一次的commit id。->git对象,git对象维护到对象库中,查看git维护的文件。
需要注意:commit只是将暂存区内的内容写入到版本仓库中的。
三、查看修改文件细节
那么现在还有一个现实操作上的问题。就是我现在正在工作区中工作,我如何去查看当前工作区的文件和我版本库中当前版本的差异呢?
命令:git status
查看当前Git仓库状态。
即将当前Gitmaster存储的版本和暂存区、工作区的文件进行对比,查看差异。
在当前提交完毕的情况下查看自然没有任何区别:

现在我将ReadMe文件新增一行:Hello, Git and Linux!

(注意echo的追加重定向>>本身是自动追加下一行,不用带"",如果带""后面的!会识别错误,注意踩坑)
此时查看就能发现差异:

可以发现,此时就是提示我们当前工作区的内容并没有添加到暂存区内(staged就是暂存区和index同样叫法)
但是这里也只是大致的提示,我们可以详细查看暂存区和工作区的细节区别:
命令:git diff [HEAD] 文件名
显示暂存区和工作区之间的详细差异。
其中存在改动前(---)、改动后(+++)
对于@@中的内容,-表示改动前,+表示改动后,数字具体表示从多少行开始,后面是连续的多少行。
@@下面的修改内容+表示新增,-表示减少。
加上HEAD 可以查看版本库和工作区之间的区别

如果add后但是还没commit可以看到版本库和工作区之间的细节差异:

四、版本回退功能
1.版本常规跳转
这是Git的重要功能之一,也是版本管理器最核心的部分。
在我们提交的几个版本中,如果能够任意回退版本就能很方便我们的工作。
命令:git reset [--soft | --mixed | --hard] id
回退到指定commit-id的版本。
选项区别:
1.soft:只回退版本库的内容
2.mixed:版本库和暂存区进行回退。-默认选项
3.hard:回退所有内容(工作区、暂存区、版本库)。
谨慎使用,容易造成数据丢失。
id:可以是commit-id,也可以是git reflog中的部分id(后续介绍git reflog)
id也可以是HEAD,表示当前Msater存储的上一个版本,HEAD^就是上上个版本,^可以不断增多,依次类推。
在上面的示例中,我们有三个版本:

现在,我想让全体跳转到第一个版本:

可以发现,版本成功回退成功,并且此时我们打印日志会发现一件惊奇的事情:
日志也是回退了的。那是不是把前两次的git文件删除了呢?那想回到之前的版本怎么办?
别急,Git记录的修改文件并没有删除,我们可以利用之前的Git日志找到之前的提交版本commit-id即可,然后就可以回到我们的第三个版本:

2.查看所有提交的git命令
那么如果此时我们找不到了之前版本日志,但是已经回退了版本怎么办?如何找到历史版本呢?(这里为了演示先回退到第一个版本)

命令:git reflog
记录本地的每次的Git执行命令,不会随着版本回退得到修改。
里面存在的一部分commit-id,使用reset一样可以进行回退。

可以发现,虽然一开始的log文件没了,但是我们还有rflog的救命稻草存在,按照部分commit-id使用reset进行回退即可。

3.撤销修改
有些时候,我们在工作区工作,比如修改了两三天了,但是发现还是不行,想回退到一开始重新写,那么这个时候需要撤销修改。
如果此时我们人工的去修改,会非常好时间并且还能把以前的代码给删了。
Git为这样的操作提供了方案(基于历史的版本)
对于三种工作区的操作,我们又可以将上述问题分解为如下的几种情况:
1.未进行add操作
命令:git checkout -- 对应文件
此时会将工作区撤回到最近一次的add操作。
比如目前我对ReadMe文件随便增加了一行数据,没有add操作。

现在直接对工作区回退到上次add操作即可:

2.进行了add操作但是没commit操作
命令:git reset [--mixed | --hard] HEAD
进行版本回退操作,选择mixed只对暂存区和版本库进行回退,对于工作区可以采用第一种,要么hard全部回退到上一次版本。
结合上面的举的例子,现在我add了,但是没有commit。
现在我先将暂存区和版本库回退到上个版本:

然后在采用1的操作即可:

3.进行了commit操作,但是没有进行push操作
命令:git reset [--mixed | --hard] HEAD^
进行版本回退操作,选择mixed只对暂存区和版本库进行回退上上个版本,对于工作区可以采用第一种,要么hard全部回退到上上次版本。
结合上面的例子,这次我commit提交到了版本库中,但是没有push到远程仓库(后面的概念,以后会提到,这里只需理解没有进行此操作即可)

实际上,这里也就是版本回退了。

五、对版本库文件的删除
如果,我们相对Git仓库下的文件机械能删除,并且想要被Git管理,一般是如下的步骤:
1删除文件,2add到暂存区,3commit提交到版本库。完成对文件的删除。
存在一个命令可以简化12步骤(将其结合在一起)
命令:git rm 文件名
会删除对应文件,然后add到暂存区内。

此时就可以完成对管理文件的删除。
相关文章:
【Git】Git的基本操作
前言 Git是当前最主流的版本管理器,它可以控制电脑上的所有格式的文件。 它对于开发人员,可以管理项目中的源代码文档。(可以记录不同提交的修改细节,并且任意跳转版本) 本篇博客基于最近对Git的学习,简单介…...
【超图】SuperMap iClient3D for WebGL/WebGPU —— 数据集合并缓存如何控制对象样式
作者:taco 最近在支持的过程中,遇到了一个新问题!之前研究功能的时候竟然没有想到。通常我们控制单个对象的显隐、颜色、偏移的参数都是根据对象所在的图层以及对象单独的id来算的。那么问题来了,合并后的图层。他怎么控制单个对象…...
intellij IDEA开发工具的使用(打开/关闭工程;删除类文件;修改类/包/模块/项目名称;导入/删除模块)
1,打开工程 打开IDEA,会看到如下界面 1栏目里是自己曾经打开过的project(工程),直接点击就好。如果需要打开其他工程,则点击open,会出下以下界面。 选择需要加载的project(工程&…...
抖音详情API:开发环境搭建与工具选择
随着短视频的流行,抖音已经成为了一个备受欢迎的社交媒体平台。对于开发人员而言,利用抖音详情API开发定制化的抖音应用具有巨大的潜力。本文将为你详细介绍开发抖音应用的开发环境搭建与工具选择,帮助你顺利地开始开发工作。 一、开发环境搭…...
IntelliJ IDEA [插件 MybatisX] mapper和xml间跳转
文章目录 1. 安装插件2. 如何使用3. 主要功能总结 MybatisX 是一款为 IntelliJ IDEA 提供支持的 MyBatis 开发插件 它通过提供丰富的功能集,大大简化了 MyBatis XML 文件的编写、映射关系的可视化查看以及 SQL 语句的调试等操作。本文将介绍如何安装、配置和使用 In…...
Havenask 分布式索引构建服务 --Build Service
Havenask 是阿里巴巴智能引擎事业部自研的开源高性能搜索引擎,深度支持了包括淘宝、天猫、菜鸟、高德、饿了么在内几乎整个阿里的搜索业务。本文针对性介绍了 Havenask 分布式索引构建服务——Build Service,主打稳定、快速、易管理,是在线系…...
vscode软件安装步骤
目录 一、下载软件安装包 二、运行安装包后 一、下载软件安装包 打开vscode官方网址,找到下载界面 链接如下:Download Visual Studio Code - Mac, Linux, Windows 我是windows电脑,各位小伙伴自己选择合适的版本,点击下载按钮…...
C语言中灵活多变的动态内存,malloc函数 free函数 calloc函数 realloc函数
文章目录 🚀前言🚀管理动态内存的函数✈️malloc函数✈️free函数✈️calloc函数✈️realloc函数 🚀在使用动态内存函数时的常见错误✈️对NULL指针的解引用✈️ 对动态开辟空间的越界访问✈️对非动态开辟内存使用free释放✈️使用free释放一…...
小细节处理
重载运算符:重载<运算符。 bool operator<(const Edge&s)const{return w<s.w;}...
【42页动态规划学习笔记分享】动态规划核心原理详解及27道LeetCode相关经典题目汇总
《博主简介》 小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推荐--…...
Python正则的匹配与替换
import re 查找时的注意事项,要查找的内容左右两边打出来,用真正的字符,不要用.*?,离查找内容远一点,再用.*? a /aksj<a>哈哈哈<a><p>拉阿鲁<p>\.askjp b re.findall(<a>(.*?)<…...
解决ELement-UI懒加载三级联动数据不回显(天坑)
最老是遇到这类问题头有点大,最后也是解决了,为铁铁们总结了一下几点 一.查看数据类型是否一致 未选择下 选择下 二.处理数据时使用this.$set方法来动态地设置实例中的属性,以确保其响应式 三.绑定v-if 确保每次重新加载 四.绑定key 五.完整代码...
【数据结构和算法】找出两数组的不同
其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 哈希类算法题注意事项 2.2 方法一:哈希法 三、代码 3.1 方法一:哈希法 四…...
基于Python的B站排行榜大数据分析与可视化系统
温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文介绍了一项基于Python的B站排行榜大数据分析与可视化系统的研究。通过网络爬虫技术,系统能够自动分析B站网址,提取大量相关文本信息并存储在系统中。通过对这些信息进行…...
MySQL一些常用命令
1、登录本地MySQL #一种是 mysql -u root -p; #(输入密码后回车)#另一种是 mysql -uroot -p123456; #(在-p后面直接带上密码)2、启动MySQL服务 net start mysql; 3、关闭MySQL服务: net stop mysql; 4、创建数据库 create database 数据库名; 5、创建数据…...
WPF 新手指引弹窗
新手指引弹窗介绍 我们在第一次使用某个软件时,通常会有一个“新手指引”教学引导。WPF实现“新手指引”非常方便,且非常有趣。接下来我们就开始制作一个简单的”新手指引”(代码简单易懂,便于移植),引用到我们的项目中又可添加一…...
py注册登录界面
代码分析 引入tkinter库,并从中导入messagebox模块。 read_users()函数用于读取存储用户信息的文本文件"users.txt"。它打开文件并逐行读取,将每行的用户名和密码以空格分隔后存储在一个列表中,最后返回该列表。 login(username,…...
基于电商场景的高并发RocketMQ实战-Consumer端队列负载均衡分配机制、并发消费以及消费进度提交
🌈🌈🌈🌈🌈🌈🌈🌈 【11来了】文章导读地址:点击查看文章导读! 🍁🍁🍁🍁🍁🍁dz…...
【Java开发岗面试】八股文—数据库MySQLRedis
声明: 背景:本人为24届双非硕校招生,已经完整经历了一次秋招,拿到了三个offer。本专题旨在分享自己的一些Java开发岗面试经验(主要是校招),包括我自己总结的八股文、算法、项目介绍、HR面和面试…...
IntelliJ IDEA [设置] 隐藏 .idea 等 .XXX 文件夹
文章目录 1. 问题描述2. 解决办法3. 最后效果4. 特殊处理(正常不需要此步骤)总结 我们使用 IntelliJ IDEA 导入项目的时候,经常会看到一些 .XXX 的文件夹(例如:.idea,.mvn,.gradle 等࿰…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
LangChain【6】之输出解析器:结构化LLM响应的关键工具
文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器?1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...

