【DevOps】Git 图文详解(四):Git 使用入门
本系列包含:
- Git 图文详解(一):简介及基础概念
- Git 图文详解(二):Git 安装及配置
- Git 图文详解(三):常用的 Git GUI
- Git 图文详解(四):Git 使用入门
- Git 图文详解(五):远程仓库
- Git 图文详解(六):Git 利器 - 分支
- Git 图文详解(七):标签管理
- Git 图文详解(八):后悔药 - 撤销变更
- Git 图文详解(九):工作中的 Git 实践
Git 图文详解(四):Git 使用入门
- 1.创建仓库
- 2.暂存区 add
- 3.提交 commit 记录
- 4.Git 的 “指针” 引用
- 5.提交的唯一标识 id,HEAD~n 是什么意思?
- 6.比较 diff
1.创建仓库
创建本地仓库的方法有两种:
- 一种是创建全新的仓库:
git init,会在当前目录初始化创建仓库。 - 另一种是克隆远程仓库:
git clone [url]
# 准备一个文件夹“KwebNote”作为仓库目录,命令行进入该文件夹
Kwongad@Kwongad-T14 MINGW64 ~
$ cd d:
Kwongad@Kwongad-T14 MINGW64 /d
$ cd Project_Files
Kwongad@Kwongad-T14 MINGW64 /d/Project_Files
# 多次cd指令进入到仓库目录KwebNote:“cd <目录名称>”指令进入目录,“cd ..”返回上级目录(有空格)
Kwongad@Kwongad-T14 MINGW64 /d/Project_Files/github.kwong/KwebNote# 开始初始化项目,也可指定目录:git init [文件目录]
$ git init
Initialized empty Git repository in D:/Project_Files/github.Kwong/KwebNote/.git/
📢注意:Git 指令的执行,都需在仓库目录下。
创建完多出了一个被隐藏的 .git 目录,这就是本地仓库 Git 的工作场所。

克隆远程仓库,如在 GitHub 上创建的仓库 https://github.com/kwonganding/KWebNote.git
$ git clone 'https://github.com/kwonganding/KWebNote.git'
Cloning into 'KWebNote'...
remote: Enumerating objects: 108, done.
remote: Counting objects: 100% (108/108), done.
remote: Compressing objects: 100% (60/60), done.
remote: Total 108 (delta 48), reused 88 (delta 34), pack-reused 0
Receiving objects: 100% (108/108), 9.36 KiB | 736.00 KiB/s, done.
Resolving deltas: 100% (48/48), done.
会在当前目录下创建 KWebNote 项目目录。

2.暂存区 add
可以简单理解为,git add 命令就是把要提交的所有修改放到暂存区(Stage),然后,执行 git commit 就可以一次性把暂存区的所有修改提交到仓库。
| | |
|---|---|
git add [file1] [file2] | 添加文件到暂存区,包括修改的文件、新增的文件 |
git add [dir] | 同上,添加目录到暂存区,包括子目录 |
git add . | 同上,添加所有修改、新增文件(未跟踪)到暂存区 |
git rm [file] | 删除工作区文件,并且将这次删除放入暂存区 |
# 添加指定文件到暂存区,包括被修改的文件
$ git add [file1] [file2] ...# 添加当前目录的所有文件到暂存区
$ git add .# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]
修改文件 R.md,未暂存:

执行 git add . 暂存:

3.提交 commit 记录
git commit 提交是以时间顺序排列被保存到数据库中的,就如游戏关卡一样,每一次提交(commit)就会产生一条记录:id + 描述 + 快照内容。
- 🔸commit id:根据修改的文件内容采用摘要算法(
SHA1)计算出不重复的 40 40 40 位字符,这么长是因为 Git 是分布式的,要保证唯一性、完整性,一般本地指令中可以只用前几位( 6 6 6)。即使多年以后,依然可通过id找到曾经的任何内容和变动,再也不用担心丢失了。 - 🔸描述:针对本次提交的描述说明,建议准确填写,就跟代码中的注释一样,很重要。
- 🔸快照:就是完整的版本文件,以对象树的结构存在仓库下
\.git\objects目录里,这也是 Git 效率高的秘诀之一。
SHA1是一种哈希算法,可以用来生成数据摘要。- Git 不适合大的非文本文件,会影响计算摘要、快照的性能。
多个提交就形成了一条时间线,每次提交完,会移动当前分支 master、HEAD 的 “指针” 位置。

Sourcetree上的历史记录:

📢一般情况,每完成一个小功能、一个 Bug 就可以提交一次,这样会形成比较清晰的历史记录。
| | |
|---|---|
git commit -m ‘说明’ | 提交变更,参数 -m 设置提交的描述信息,应该正确提交,不带该参数会进入说明编辑模式 |
git commit -a | 参数 -a,表示直接从工作区提交到版本库,略过了 git add 步骤,不包括新增的文件 |
git commit [file] | 提交暂存区的指定文件到仓库区 |
git commit --amend -m | 使用一次新的 commit,替代上一次提交,会修改 commit 的 hash 值(id) |
git log -n 20 | 查看日志(最近 20 20 20 条),不带参数 -n 则显示所有日志 |
git log -n 20 --oneline | 参数 --oneline 可以让日志输出更简洁(一行) |
git log -n 20 --graph | 参数 --graph 可视化显示分支关系 |
git log --follow [file] | 显示某个文件的版本历史 |
git blame [file] | 以列表形式显示指定文件的修改记录 |
git reflog | 查看所有可用的历史版本记录(实际是 HEAD 变更记录),包含被回退的记录(重要) |
git status | 查看本地仓库状态,比较常用的指令,加参数 -s 简洁模式 |

通过 git log 指令可以查看提交记录日志,可以很方便的查看每次提交修改了哪些文件,改了哪些内容,从而进行恢复等操作。
# 提交暂存区到仓库区
$ git commit -m [message]
# 提交所有修改到仓库
$ git commit -a -m'修改README的版权信息'# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]$ git log -n 2
commit 412b56448568ff362ef312507e78797befcf2846 (HEAD -> main)
Author: Kanding <123anding@163.com>
Date: Thu Dec 1 19:02:22 2022 +0800commit c0ef58e3738f7d54545d8c13d603cddeee328fcb
Author: Kanding <123anding@163.com>
Date: Thu Dec 1 16:52:56 2022 +0800# 用参数“--oneline”可以让日志输出更简洁(一行)
$ git log -n 2 --oneline
5444126 (HEAD -> main, origin/main, origin/HEAD) Update README.md
228362e Merge branch 'main' of github.com:kwonganding/KWebNote
4.Git 的 “指针” 引用
Git 中最重要的就是提交记录了,其他如 标签、分支、HEAD 都是对提交记录的 “指针” 引用,指向这些提交记录,理解这一点很重要。
- 提交记录之间也存在 “指针” 引用,每个提交会指向其上一个提交。
- 标签:就是对某一个提交记录的 固定 “指针” 引用,取一个别名更容易记忆一些关键节点。存储在工作区根目录下
.git\refs\tags。 - 分支:也是指向某一个提交记录的 “指针” 引用,“指针” 位置可变,如提交、更新、回滚。存储在工作区根目录下
.git\refs\heads。 - HEAD:指向当前活动分支(最新提交)的一个 “指针” 引用,存在在
.git/HEAD文件中,存储的内容为ref: refs/heads/master。

上图中:
HEAD始终指向当前活动分支,多个分支只能有一个处于活动状态。- 标签
t1在某一个提交上创建后,就不会变了。而分支、HEAD的位置会改变。
打开这些文件内容看看,就更容易理解这些 “指针” 的真面目了。
# tag
$ git tag -a 'v1' -m 'v1版本'
$ cat .git/refs/tags/v1
a2e2c9caea35e176cf61e96ad9d5a929cfb82461# main分支指向最新的提交
$ cat .git/refs/heads/main
8f4244550c2b6c23a543b741c362b13768442090# HEAD指向当前活动分支
$ cat .git/HEAD
ref: refs/heads/main# 切换到dev分支,HEAD指向了dev
$ git switch dev
Switched to branch 'dev'
$ cat .git/HEAD
ref: refs/heads/dev
这里的主分支名字为 main,是因为该仓库是从 GitHub 上克隆的,GitHub 上创建的仓库默认主分支名字就是 main,本地创建的仓库默认主分支名字为 master。
📢 “指针” 引用:之所以用引号的 “指针”,是为了便于统一和理解。和指针原理类似,都是一个指向,只是实际上可能更复杂一点,且不同的 “指针” 引用会有区别。
5.提交的唯一标识 id,HEAD~n 是什么意思?
每一个提交都有一个唯一标识,主要就是提交的 hash 值 commit id,在很多指令中会用到,如版本回退、拣选提交等,需要指定一个提交。那标识唯一提交有两种方式:
- 首先就是
commit id,一个 40 40 40 位编码,指令中使用的时候可以只输入前几位( 6 6 6 位)即可。 - 还有一种就是
HEAD~n,是基于当前HEAD位置的一个相对坐标。HEAD表示当前分支的最新版本,是比较常用的参数。HEAD^表示上一个版本,HEAD^^表示上上一个版本。HEAD~或HEAD~1表示上一个版本,以此类推,HEAD^10为最近第 10 10 10 个版本。HEAD@{2}表示在git reflog日志中标记的提交记录索引。
通过 git log、git reflog 可以查看历史日志,可以看每次提交的唯一编号(hash)。区别是 git reflog 可以查看所有操作的记录(实际是 HEAD 变更记录),包括被撤销回退的提交记录。
$ git reflog -n 10
5acc914 (HEAD -> main) HEAD@{0}: reset: moving to HEAD~
738748b (dev) HEAD@{1}: reset: moving to HEAD~
9312c3e HEAD@{2}: reset: moving to HEAD~
db03fcb HEAD@{3}: reset: moving to HEAD~
1b81fb3 HEAD@{4}: reset: moving to HEAD~
41ea423 HEAD@{5}: reset: moving to HEAD~
d3e15f9 HEAD@{6}: reset: moving to d3e15f9
1b81fb3 HEAD@{7}: reset: moving to HEAD~1
41ea423 HEAD@{8}: reset: moving to HEAD~
d3e15f9 HEAD@{9}: reset: moving to HEAD~
6.比较 diff
git diff 用来比较不同文件版本之间的差异。
| | |
|---|---|
git diff | 查看暂存区和工作区的差异 |
git diff [file] | 同上,指定文件 |
git diff --cached | 查看已暂存的改动,就是暂存区与新版本 HEAD 进行比较 |
git diff --staged | 同上 |
git diff --cached [file] | 同上,指定文件 |
git diff HEAD | 查看 已暂存的 + 未暂存的 所有改动,就是与最新版本 HEAD 进行比较 |
git diff HEAD~ | 同上,与上一个版本比较。HEAD~ 表示上一个版本,HEAD~10 为最近第 10 10 10 个版本 |
git diff [id] [id] | 查看两次提交之间的差异 |
git diff [branch] | 查看工作区和分支直接的差异 |
☘️ 画个图更清晰些:

# 查看文件的修改
$ git diff README.md# 查看两次提交的差异
$ git diff 8f4244 1da22# 显示今天你写了多少行代码:工作区+暂存区
$ git diff --shortstat "@{0 day ago}"
相关文章:
【DevOps】Git 图文详解(四):Git 使用入门
本系列包含: Git 图文详解(一):简介及基础概念Git 图文详解(二):Git 安装及配置Git 图文详解(三):常用的 Git GUIGit 图文详解(四)&a…...
Jquery ajax 同步阻塞引起的UI线程阻塞的坑(loading图片显示不出来 )
Jquery ajax 同步阻塞引起的UI线程阻塞的坑(loading图片显示不出来,layer.load延迟)jax重新获取数据刷新页面功能,因为ajax属于耗时操作,想在获取数据且加载页面时显示加载遮罩层,结果发现了ajax的好多坑。…...
读书笔记——《黑猩猩的政治》
前言 弗朗斯德瓦尔(Frans de Waal)的代表作《黑猩猩政治》成书于1982年,是它的首部书籍作品,也是美国国会新任议员的被推荐读物。之前看的他另一部作品的《万智有灵》是2016年的作品,时间跨度居然这么大。《万智有灵》介绍了许多…...
此处不允许使用特性namespace
1.DOCTYPE 后面改成 mapper 2.PUBLIC一行中的Config改为Mapper 3.将下一行config变为小写的mapper <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.or…...
随笔记录-springmvc_ResourceHandlerRegistry+ResourceHttpRequestHandler
环境:springboot-2.7.5 配置文件配置静态资源映射 springboot配置静态资源映射方式是通过 WebMvcAutoConfiguration 实现的 spring: # resources: # # 自springboot 2.5.5之后,该属性已经被废弃,使用spring.web.resources.static-locat…...
Redis面试内容,Redis过期策略,Redis持久化方式,缓存穿透、缓存击穿和缓存雪崩,以及解决办法
文章目录 一、redis什么是RedisRedis使用场景1、缓存2、数据共享[分布式](https://so.csdn.net/so/search?q分布式&spm1001.2101.3001.7020)3、分布式锁4、全局ID5、计数器6、限流7、位统计 Redis有5中数据类型: SSHLZRedis中一个key的值每天12点过期ÿ…...
爱上C语言:scanf、gets以及getchar输入字符串你真的懂了吗
🚀 作者:阿辉不一般 🚀 你说呢:不服输的你,他们拿什么赢 🚀 专栏:爱上C语言 🚀作图工具:draw.io(免费开源的作图网站) 如果觉得文章对你有帮助的话,还请点赞…...
ubuntu Setforeground 前台应用切换
场景分析 有这样一个系统,一个服务主进程用于接收指令,其它服务是独立的gui 程序,服务进程根据命令将对应的gui 程序切换到前台。 windows 平台有Setforeground 这个api,可以根据进程ID,将某个应用的窗口切换到前台。…...
【Java 进阶篇】从Java对象到JSON:Jackson的魔法之旅
在现代的软件开发中,处理数据的能力是至关重要的。而当我们谈及数据格式时,JSON(JavaScript Object Notation)通常是首选。为了在Java中轻松地将对象转换为JSON,我们需要一种强大而灵活的工具。这时,Jackso…...
HarmonyOS ArkTS语言,运行Hello World(二)
一、认识DevEco Studio界面 进入IDE后,我们首先了解一下基础的界面。整个IDE的界面大致上可以分为四个部分,分别是代码编辑区、通知栏、工程目录区以及预览区。 代码编辑区 1、中间的是代码编辑区,你可以在这里修改你的代码,以…...
四、文件包含漏洞
一、文件包含漏洞 解释:文件包含漏洞是一种注入型漏洞,其本质就是输入一段用户能够控制的脚本或者代码,并让服务端执行;其还能够使得服务器上的源代码被读取,在PHP里面我们把可重复使用的函数写入到单个文件中&#x…...
Java中基于SSM框架的数据保存方法与日期处理
一、详解 在SSM框架中,保存数据通常涉及到服务层和数据访问层。服务层处理业务逻辑,而数据访问层负责与数据库进行交互。 二、代码 Override public void save(Student student) { Date date new Date(); SimpleDateFormat format new Sim…...
编译器核心技术概览
编译技术是一门庞大的学科,我们无法对其做完善的讲解。但不同用途的编译器或编译技术的难度可能相差很大,对知识的掌握要求也会相差很多。如果你要实现诸如 C、JavaScript 这类通用用途语言(general purpose language),…...
本地训练,开箱可用,Bert-VITS2 V2.0.2版本本地基于现有数据集训练(原神刻晴)
按照固有思维方式,深度学习的训练环节应该在云端,毕竟本地硬件条件有限。但事实上,在语音识别和自然语言处理层面,即使相对较少的数据量也可以训练出高性能的模型,对于预算有限的同学们来说,也没必要花冤枉…...
守护进程的理解
什么是守护进程 daemon False # 是否以守护进程方式运行,True守护,False 非守护 在这段代码中,daemon 变量的值决定了进程是否以守护进程方式运行。如果 daemon 的值为 True,则表示进程将以守护进程方式运行,否则为…...
VMware虚拟机的安装教程
安装VMware虚拟机的步骤如下: 首先,你需要从VMware官方网站(https://www.vmware.com)下载VMware虚拟机软件安装程序。 一旦下载完成,双击运行安装程序。 在安装程序启动后,你将看到一个欢迎界面。点击"…...
Linux环境搭建(tomcat,jdk,mysql下载)
是否具备环境(前端node,后端环境jdk)安装jdk,配置环境变量 JDK下载 - 编程宝库 (codebaoku.com) 进入opt目录 把下好的安装包拖到我们的工具中 把解压包解压 解压完成,可以删除解压包 复制解压文件的目录,配置环境变量…...
80万条中文ChatGPT多轮对话数据集
80万条中文ChatGPT多轮对话数据集 代码代码地址代码解析 代码 import json import numpy as np from tqdm import tqdm import redef find_chinese_text(text):pattern re.compile(r[^\u4e00-\u9fff])return pattern.sub(, text)with open("E:/data_sets/multiturn_chat…...
阿里云ECS服务器如何搭建并连接FTP,完整步骤
怎么用终端连接服务器就不多说了,直接开始搭建FTP。 我是用root账号执行的命令,如果不使用root账号,注意在命令前面加sudo。 一、安装FTP 我这里安装的是vsftpd。 1、检查是否已安装vsftpd: vsftpd -v如果出现了版本信息&…...
uni-app 使用uni.getLocation获取经纬度配合腾讯地图api获取当前地址
前言 最近在开发中需要根据经纬度获取当前位置信息,传递给后端,用来回显显示当前位置 查阅uni-app文档,发现uni.getLocation () 可以获取到经纬度,但是在小程序环境没有地址信息 思考怎么把经纬度换成地址,如果经纬度…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
如何应对敏捷转型中的团队阻力
应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中,明确沟通敏捷转型目的尤为关键,团队成员只有清晰理解转型背后的原因和利益,才能降低对变化的…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...
