Git 使用指南 --- 版本管理
序言
Git 是一个开源的 分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。对一个程序员来说,掌握 Git 的使用是必要的。
在这个系列中,将详细的介绍 Git 的使用和原理,话不多说,让我们开始吧。
1. 安装 Git
1.1 Linux — Centos
首先你可以使用指令来查看是否已安装 Git:
git
若未安装,则会显示信息:
-bash: git: command not found
可使用指令安装 Git:
sudo yum -y install git
1.2 Linux — Ubuntu
同样的,你可以使用指令来查看是否已安装 Git:
git
若未安装,则会显示信息:
Command 'git' not found, but can be installed with:
sudo apt install git
可使用指令安装 Git:
sudo apt install git
1.3 Windows
Windows 系统下,大家首先可以点击 Git 官网下载链接 下载 git。在安装时会有许多额外的选项,对初学者的我们来说,一路点击 next 使用默认选项就要够啦。
现在,怎么使用呢?首先,随便点击一个文件夹,然后点击 查看更多选项,之后,如果弹出的选项中包含如下图像就说明成功安装了!

2. 初始化本地仓库
创建一个本地的仓库,本质就是创建一个 进行版本控制的文件目录,要对文件进行版本控制,就必须先创建仓库。
2.1 创建本地仓库
先进入到你想要进行版本管理的文件夹当中,使用指令 git init,即可创建一个本地仓库:
](https://i-blog.csdnimg.cn/direct/9be031f45dd142519ab162de1273d6c6.png)
这里文件夹中多了一个名为 .git 的文件说明创建成功了!
2.2 初始化用户名和邮箱
之后便是配置用户信息,你需要配置你的用户名:
git config [--global] user.name "Your_Name"
还需要配置你的邮箱:
git config [--global] user.email "Your_Email"
在这里的 [--global] 代表是一个可选项,如果加上则代表 这台机器所有的 Git 仓库 都会使用该消息配置。
你可以使用指令来查看你所配置的信息:
git config -l
如果你想要删除相应的信息:
git config unset [--global] user.name // 删除用户名
git config unset [--global] user.email // 删除邮箱
3. 相关操作以及区域概念
首先我们需要理解 工作区,暂存区,版本库 的概念:
工作区:当我们增删改文件时,所处在的目录。暂存区:存放在.git目录下的index文件中,提供了在提交之前对更改进行组织和准备的能力。版本库:⼯作区有⼀个隐藏⽬录.git,它不算⼯作区,⽽是Git的版本库。这个版本库⾥⾯的所有⽂件都可以被Git管理起来,每个⽂件的修改、删除都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
这些概念现在大家看来会十分摸不着头脑,但是随着我们后面逐渐的深入,大家再来看就会有自己的理解了,但是现在大家请记住 真正进行版本管理的地方是版本库!
3.1 添加文件
我们可以使用指令将一个或多个文件从工作区存入暂存区:
git add [file1] [file2] [file3]... // 将指定文件添加到暂存区
git add . // 将工作区所有文件添加到暂存区
之后,我们可以使用指令将文件从暂存区存入到版本库中:
git commmit -m "Your_Msg" // 在这里,需要描述你的提交细节,帮助其他人看到更好的理解
在完成这两步之后,会显示信息:

一个文件被改变,插入一行内容。
3.2 删除文件
如果我们想要删除一个版本库中的文件,首先你需要使用指令将该修改写入暂存区中:
git rm [file]
之后将删除操作提交到版本库,完成更新:
git commmit -m "Your_Msg"
3.3 修改文件
首先我对我的文件对多写入了一行内容,先介绍一个命令可以查看你仓库的状态(那些文件被修改后还没有添加提交):
git status
输入该指令后,我们可以看到:

他告诉我们 readme 这个文件被修改了,我们可以使用指令来查看工作区和暂存区的区别:
git diff [file]
这里输出的格式可能大家会觉得很奇怪:

这里的 - 代表的是暂存区中的内容,+ 代表的是工作区中的内容(最新的),所以
@@ -1 +1, 2 @@ 代表的是:
- 旧内容是第一行
- 新内容是第一行开始到第二行
之后将修改的文件上传的版本库的操作和添加文件一摸一样。
3.4 查看日志信息
我们可以通过指令来查看我们的历史提交记录:
git log

可以看到这里记录所有提交的详细信息,并且每一次提交都会分配一个 commit id,每一次提交都代表一个新的版本,所以这里可以理解为这是一个版本号。
你也可以添加选项让更为优雅的输出相应的信息:
git log --pretty=oneline

3.5 .git 文件
在经过了上述一系列操作之后,我们再查看这个神奇的 .git 文件,我们使用指令 tree .git/ 以树状的形式查看目录:

我们介绍其中比较重要的几个组成部分:
-
index:这就暂存区,我们add的文件都存在于此处 -
HEAD:指向当前正在工作的分支,默认指向master(多分支时进一步介绍):
那master又指向的是什么呢?使用cat指令查看一下:

一串很长的不知道是什么的序列,不知道大家还记得我们在前面讲到过一个概念commit_id,这串序列就是commit_id,我们使用git log指令打印一下提交记录,查看是否存在这样一个commit_id:

不仅找到了还是第一个(最新那个),不难推断 —master 保存的就是当前最新 的 commit id。 -
objects:为 Git 的对象库,⾥⾯包含了创建的各种版本库对象及内容。当执⾏git add命令时,暂存区的⽬录树被更新,同时⼯作区修改(或新增)的⽂件内容被写⼊到对象库中的⼀个新的对象中,就位于.git/objects⽬录。
4. 版本回退
4.1 回退指令
在开始讲解回退之前,我们想了解一个重要的指令:
git reset [--soft | --mixed | --hard] [HEAD]
回退 本质是 将版本库中的内容进⾏回退,⼯作区或暂存区是否回退由命令参数决定。
现在我们先介绍前一个选项:
• --mixed 为默认选项,使⽤时可以不⽤带该参数。该参数 将暂存区的内容退回为指定提交版本内容,⼯作区⽂件保持不变。
• --soft 参数对于 ⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
• --hard 参数 将暂存区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重 !!!
在这里向大家举个栗子:

现在我们介绍第二个参数,该参数代表我们需要回退的版本,默认 HEAD 是当前版本:
HEAD^代表上一个版本,HEAD^^代表上两个版本,以此类推commit id代表的就是一个版本号,可使用commit id回退到指定版本,使用git log / git reflog查看commit id。
4.2 回退场景
1. 只是修改工作区中的代码
我完成了第一版代码,并且已经上传到版本库中了。现在我想要在第一版的基础上进行改善,但是经过改造之后原本可以正常运行的代码成功的歇菜了。
现在我想要将我工作区的代码回退到版本一,方案一:最笨的方法就是手动删除当然极其不推荐。
方案二:使用指令 git checkout -- [file] 将工作区的代码更新为最新提交到暂存区的文件
2. 修改的代码添加到暂存区
现在我不小心将我的代码也添加到了暂存区中,这又改怎么回退到版本一呢?
使用指令 git reset --hard HEAD ,就可以将你的工作区和暂存区便回来啦!
3. 修改的代码提交到版本库
这个就直接使用我们的指令 git reset --hard HEAD^,解决起来还是比较简单。
4. 回退的本质
在 Git 内部当中,是怎么实现版本回退的呢,请看下图:

我们在前面介绍过 master 保存的就是当前最新的 commit id(版本),改变当前的版本,也就是改变 master 的指向。
5. 总结
在这篇文章中我们介绍了 Git 的版本管理以及其背后的部分原理,希望大家有所收获!
相关文章:
Git 使用指南 --- 版本管理
序言 Git 是一个开源的 分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。对一个程序员来说,掌握 Git 的使用是必要的。 在这个系列中,将详细的介绍 Git 的使用和原理,话不多说,让我们开始吧。…...
C#进阶-ASP.NET实现可以缩放和旋转的图片预览页
本文详细介绍了如何在ASP.NET WebForms中实现一个功能丰富的图片预览页面。通过结合HTML、CSS和JavaScript,用户可以方便地对图片进行放大、缩小以及旋转操作。文章从页面的基本布局开始,逐步讲解了如何设置图片展示区、添加控制按钮、编写CSS样式以及实…...
【小程序 - 大智慧】深入微信小程序的核心原理
目录 课程目标背景双线程架构WebView 结构快速渲染 PageFrame编译原理Exparser通讯系统生命周期基础库解包跨端框架预编译半编译半运行运行时框架 主流技术Tarouni-app汇总 下周安排 课程目标 本次课程主要通过后台管理小程序回顾一下小程序的高阶语法,然后讲解整体…...
Qt 去掉QDialog对话框的问号
QT 对话框的问号是什么? QDialog默认的window flag中包含了Qt::WindowContextHelpButtonHint,这个flag意思是在窗口上提供“上下文帮助”按钮 使用方式/调用方式 void QWidget::setWhatsThis(const QString &)比如: ui->lineEdit_1->setWh…...
负载均衡 Ribbon 与 Fegin 远程调用原理
文章目录 一、什么是负载均衡二、Ribbon 负载均衡2.1 Ribbon 使用2.2 Ribbon 实现原理 (★)2.3 Ribbon 负载均衡算法 三、Feign 远程调用3.1 Feign 简述3.2 Feign 的集成3.3 Feign 实现原理 (★) 一、什么是负载均衡 《服务治理:Nacos 注册中心》 末尾提到了负载均…...
c/c++:CMakeLists.txt中添加编译/连接选项使用内存错误检测工具Address Sanitizer(ASan)
Address Sanitizer(ASan)是一个快速的内存错误检测工具。从gcc 4.8开始,AddressSanitizer成为gcc的一部分。 既然是gcc内置的内存检查工具,用起来比第三方的库更方便些。只要指定相应的编译链接参数就可以实现内存泄露检查了,如下是是cmake脚…...
armbian cups 远程打印机 1022
使用 CUPS Web 浏览器界面设置和管理打印机 - Oracle Solaris 管理:常见任务 N1刷armbian变身打印服务器,支持全平台无线打印PC扫描_存储设备_什么值得买 (smzdm.com) 第 6 章 使用 Web 界面向 CUPS 添加打印机 | Red Hat Product Documentation apt…...
three.js使用3DTilesRendererJS加载3d tiles数据
原生的 three.js 目前不支持 3d tiles 数据的加载,不过开源社区已经给出了一些解决方案,其中最活跃的要属 3DTilesRendererJS。它为 three.js 提供了加载和调度 3d tiles 数据的基本能力,虽说和 Cesium.js 对 3d tiles 的支持相比还有很大的差…...
坐牢第三十五天(c++)
一.作业 1.使用模版类自定义栈 代码: #include <iostream> using namespace std; template<typename T> // 封装一个栈 class stcak { private:T *data; //int max_size; // 最大容量int top; // 下标 public:// 无参构造函数stcak();// 有参…...
Conda离线部署django
要在没有网络连接的环境中使用conda部署Django,你需要预先在有网络连接的机器上创建一个包含所有必要包的环境,并导出该环境的配置文件。然后,你可以将这个配置文件和必要的包传输到目标机器上进行安装。 下面是详细的步骤: 1. …...
1. Fabric.js安装使用
安装 # 安装 fabricjs npm i fabric --save在需要使用的页面引入 import * as fabric from fabric...
Excel中.xls和.xlsx文件格式的区别,及C++操作Excel文件
文件结构和兼容性: XLS是Excel 97-2003版本的文件格式,而XLSX是Excel 2007及以上版本的文件格式。XLS格式是向下兼容的,意味着较新的Excel版本可以打开XLS文件,但较旧的版本无法打开XLSX文件。相反,XLSX格式是向上…...
php实用命令
php相关命令 命令错误级别 命令 命令命令介绍具体用法php -v查看php版本php -vphp -l检查php文件是否有语法错误php -lphp -m查看当前php安装的扩展php -mphp -i | grep extension_dir查看扩展安装的目录php -i | grep extension_dir 错误级别 命令命令介绍具体用法error_re…...
TypeError:未绑定方法
TypeError: unbound method 错误通常发生在类方法被调用时,但没有正确绑定到实例。这通常意味着你试图在类本身上调用一个实例方法,或者没有使用正确的方式创建类实例。 1、问题背景 某位开发者在尝试创建一个类似于经典的 Pratt 递归下降解析器时遇到了…...
Java虚拟机(JVM)的架构和工作原理,字节码执行流程
JVM的概念 JVM是Java Virtual Machine的缩写, 即Java虚拟机,也被称为Java程序运行的核心环境 。它是一种用于计算设备的规范,通过在实际的计算机上仿真模拟各种计算机功能来实现。JVM由一套字节码指令集、一组寄存器、一个栈、一个…...
416.分割等和子集
416.分割等和子集 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1,5,11,5] 输出:true 解释:数组可以分割成 [1, 5, 5] 和…...
python初始化一个三维数组
文章目录 1.什么是三维数组2.那我应该如何初始化一个自定义长度的三维数组呢? 1.什么是三维数组 从最外层开始理解,可以理解为一维数组,里面套了一个二维数组(12等于三维数组) arr [ [[], []], [[], [], []], [[],[]]…...
EI会议推荐-第二届大数据与数据挖掘国际会议(BDDM 2024)
第二届大数据与数据挖掘国际会议(BDDM 2024) 1、基本信息 大会官网:http://www.icbddm.org/ 官方邮箱:icbddm163.com 主办方:武汉纺织大学 会议时间:2024年12月13日-12月15日 会议地点:湖…...
RK3566/RK3568 Android 11 动态显示/隐藏下拉框
概述 在系统服务中增加显示/隐藏状态栏方法,在上层app动态调用显示/隐藏下拉框方法,设备关机和重启后也能继续生效。 创建全局变量 1.定义全局变量 在frameworks/base/core/java/android/provider/Settings.java中添加 /*** Disable drop-down box* @hide*/public static…...
Android图片缓存工具类LruCache原理和使用介绍
LruCache & DiskLruCache原理。 常用的三级缓存主要有LruCache、DiskLruCache、网络,其中LruCache对应内存缓存、 DiskLruCache对应持久化缓存。Lru表示最近最少使用,意思是当缓存到达限制时候,优先淘汰近 期内最少使用的缓存,…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
Java并发编程实战 Day 11:并发设计模式
【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天,今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案,它们不仅提供了优雅的设计思路,还能显著提升系统的性能…...
【Java多线程从青铜到王者】单例设计模式(八)
wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本,sleep也是可以指定时间的,也就是说时间一到就会解除阻塞,继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒),wait能被notify提前唤醒…...
基于Uniapp的HarmonyOS 5.0体育应用开发攻略
一、技术架构设计 1.混合开发框架选型 (1)使用Uniapp 3.8版本支持ArkTS编译 (2)通过uni-harmony插件调用原生能力 (3)分层架构设计: graph TDA[UI层] -->|Vue语法| B(Uniapp框架)B --&g…...
