Git 基本原理和常用操作
Git
Git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。由 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开源的版本控制软件。
Git 常用操作
git 提交流程:工作区 -> git add 到暂存区 -> git commit 到本地版本库 -> git push 到远程库
远程库:局域网有 Gitlab;互联网有 GitHub、Gitee

Git中最重要的就是提交记录,其他如标签、分支、HEAD 都对提交记录的“指针”引用,指向这些提交记录。
- 提交记录之间也存在“指针”引用,每个提交会指向其上一个提交。
- 标签 就是对某一个提交记录的的 固定 “指针”引用,取一个别名更容易记忆一些关键节点。存储在工作区根目录下
.git\refs\tags。 - 分支 也是指向某一个提交记录的“指针”引用,“指针”位置可变,如提交、更新、回滚。存储在工作区根目录下
.git\refs\heads。 - HEAD:指向当前工作分支/活动分支(最新提交)的一个“指针”引用,存在在“
.git/HEAD”文件中,存储的内容为“ref: refs/heads/master”。相当于在一个 commit 链表上的指针,链表上的每个节点都是一次 commit。
checkout
分支切换,使用 git checkout dev切换分支时,干了两件事:
- ①、
HEAD指向dev:修改HEAD的“指针”引用,指向dev分支。 - ②、还原工作空间:把
dev分支内容还原到工作空间。
切换时还没提交的代码怎么办?
- 如果修改(包括未暂存、已暂存)和待切换的分支没有冲突,则切换成果,且未提交修改会一起带过去,所以要注意!
- 如果有冲突,则会报错,提示先提交或隐藏,关于隐藏可查看后续章节内容“stash”。
checkout 也可用于撤销,只针对未提交的修改。
commit --amend
如果我们提交修改后发现有些文件没有添加,或者提交信息写错了,则可以通过 --amend 选项修正提交。
reset
重置版本,原理是通过移动 HEAD 指针,所以支持回退版本和重新恢复回退前的版本,可以实现版本之间的来回穿梭。
三种模式
- soft,工作区、暂存区状态不变
- mixed,默认模式,工作区不变,撤销暂存区状态
- hard,强制回退,撤销工作区和暂存区状态!
注意,hard 模式 操作会丢失reset之前的未提交的代码!(也可以恢复但是比较麻烦)
revert
撤销提交,安全撤销某一个提交记录,基本原理就是创建一个新的提交,用原提交的逆向操作来完成撤销操作。注意,这不同于reset,reset是回退版本,revert只是用于撤销某一次历史提交,操作是比较安全的。
merge
合并分支,把两个分支的修改内容合并到一起,git merge [branch],将分支[branch]合并到当前分支。根据要合并的内容的不同,具体合并过程就会有多种情况。
rebase
衍合分支,变基,把两个分支的修改内容合并到一起的办法有两种:merge 和 rebase,作用都是一样的,区别是rebase的提交历史更简洁,干掉了提交分叉,但 merge 的提交历史更完整,更可追溯。
rebase 是一个相当强大的命令,rebase可以加上-i进行交互式地变基,我们可以在任何想要的修改完成之后停止,也可以添加文件或者是做其他想要做的事情。
rebase 命令推荐文章:
git rebase详解(图解+最简单示例,一次就懂)_风中一匹狼v的博客-CSDN博客
详解git rebase,让你走上git大神之路 - 知乎 (zhihu.com)
Git提交错了不用慌,这三招帮你修改记录 - 知乎 (zhihu.com)
git rebase的时候捅娄子了,怎么办?在线等…… - 知乎 (zhihu.com)
stash
隐藏操作,如果切换分支时,未提交修改的内容没有冲突,是可以成功切换的,未提交修改会被带过去。
但是如果有未提交修改,切换分支时报错,那么就可以把当前工作区、暂存区 未提交的内容“隐藏”起来,就像什么都没发生一样。
cherry-pick
拣选提交,选择一个commit,合并进当前分支。
状态模型
工作区(workspace)
当前工作空间,也就是在本地文件夹下看到的文件结构。初始化工作空间或者工作空间 clean 的时候,文件内容和 index 暂存区是一致的,随着修改,工作区文件在没有 add 到暂存区时候,工作区将和暂存区是不一致的。
当我们做出了新增/修改,在 add 之前,这些修改还在工作区,通常我们会在 IDE 中设置 默认将修改 add 到暂存区(至少我是这么搞的)。此时文件的状态为 已修改(modified)
暂存区(stage/index)
也被叫做索引,文件暂时存放的地方,所有暂时存放在暂存区中的文件将随着一个 commit 一起提交到 local repository 此时 local repository 里面文件将完全被暂存区所取代。
将工作区的修改 add 了之后,这些修改就在暂存区了。此时文件的状态为 已暂存(staged)
本地仓库(local repository)
即 .git 目录,git 是分布式版本控制系统,和其他版本控制系统不同的是他可以完全去中心化工作,你可以不用和中央服务器 (remote server) 进行通信,在本地即可进行全部离线操作,包括 log,history,commit,diff 等等。完成离线操作最核心是因为 git 有一个几乎和远程一样的本地仓库,所有本地离线操作都可以在本地完成,等需要的时候再和远程服务进行交互。
将暂存区的修改 commit 之后,这些修改就被会提交到本地仓库,并生成 commit 对象。此时文件的状态为 已提交(committed)
远程仓库(remote repository)
开发成员内共享,本地仓库会和远程仓库进行交互,也就能将其他人的修改更新到本地仓库,把自己的修改上传至远程仓库供其他人获取。结构大体和本地仓库一样。
当执行了 push 之后,对应的 commit 就被提交到远程仓库了。
对象模型
git 在本地是有一个完整的 git 仓库也就是 .git 文件目录,通过这个仓库,git 就可以完全离线化操作。在这个本地化的仓库中存储了 git 所有的模型对象。
git 主要有四个对象,分别是 Blob,Tree,Commit,Tag 他们都用 SHA-1 进行命名。SHA-1(Secure Hash Algorithm 1)是一种密码散列函数,即散列加密,SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。
Blob 对象
只用于存储单个文件内容,一般都是二进制的数据文件,不包含任何其他文件信息,比如不包含文件名和其他元数据。
Tree 对象
对应文件系统的目录结构,里面主要有:子目录 (tree),文件列表 (blob),文件类型以及一些数据文件权限模型等。
Commit 对象
是修改过的文件集的一个快照,随着一次 commit 操作,将创建一个 commit 对象,修改过的文件将会被提交到 local repository 中。通过 commit 对象,在版本化中可以检索出每次修改内容,是版本化的基石。
Tag 对象
tag 是一个"固化的分支",一旦打上 tag 之后,这个 tag 代表的内容将永远不可变,因为 tag 只会关联当时版本库中最后一个 commit 对象。一般应用或者软件版本的发布一般用 tag。
存储模型
Svn 等其他的 VCS 对文件版本的理念是以文件为水平维度,记录每个文件在每个版本下的 delta 改变。
Git 对文件版本的管理理念却是以每次提交为一次快照,而不是进行差异比较,提交时对所有修改过的文件做一次全量快照,然后存储快照引用。Git 在存储层,如果文件数据没有改变的文件,Git 只是存储指向源文件的一个引用,并不会直接多次存储文件,这一点可以在 pack 文件中看见。
参考文章&推荐阅读
- 这才是真正的Git——Git内部原理揭秘! - 知乎 (zhihu.com)
- 一文讲透 Git 底层数据结构和原理 - 知乎 (zhihu.com)
- Git入门图文教程(1.5W字40图)🔥🔥–深入浅出、图文并茂 - 安木夕 - 博客园 (cnblogs.com)
相关文章:
Git 基本原理和常用操作
Git Git 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。由 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开源的版本控制软件。 Git 常用操作 git 提交流程:工作区 -> git add 到暂存区 -> gi…...
单元测试和集成测试的区别
单元测试和集成测试是软件开发中常用的两种测试方法,它们的主要区别如下: 范围不同:单元测试关注于对软件中的最小功能单元进行测试,通常是对独立的函数、方法或类进行测试。而集成测试则更加综合,涉及多个模块、组件或…...
node基础概念
前言:可以让别人访问我们的网页,可以开发服务端应用、工具类应用、桌面端应用(electron) 1. 计算机基础 概念:CPU 内存 硬盘 主板 显卡 2. 进程和线程 概念:进程是一个程序的执行,线程组合形…...
ArcGIS Maps SDK for JS(二):MapView简介----创建2D地图
文章目录 1 AMD 引用 ArcGIS Maps SDK for JavaScript2 加载相应模块3 创建地图4 创建 2D 视图 view5 确定页面内容6 CSS 样式7 完整代码 本教程使用 AMD 模块,指导您如何在二维地图视图中创建一个简单的地图。 1 AMD 引用 ArcGIS Maps SDK for JavaScript 在 <…...
知识图谱推理研究综述9.3
综述分类 根据样本量大小的不同,将知识图谱推理方法分为多样本推理、少样本推理和零与单样本推理 KG定义:(Y) 知识图谱是以图的形式表示真实世界的实体与关系之间关系的知识库。 具体来说知识图谱是通过将应用数学、图形学、信…...
详细介绍c++中的类
C 中的类是面向对象编程的基本概念,它指的是一种能够封装数据和方法的用户定义数据类型。类是程序中一个重要的概念,它允许程序员通过定义类来实现代码复用、模块化和继承等特性。 C 中的类由以下部分组成: Data members:成员变量…...
C语言:扫雷小游戏
文接上一篇博文C语言:三子棋小游戏。本篇博文是使用C语言来实现扫雷小游戏的。这里不对扫雷的规则进行赘述。玩家通过键盘输入坐标来探雷。博主在实现扫雷之前从未看过扫雷实现的相关视频,所以这里实现的扫雷完全是博主的原生思路,具有逻辑性…...
VScode SSH无法免密登录
配置方法 引用高赞贴:点击 debug方法 连不上需要找到问题原因,看ssh的 log Linux服务器:2222是我们指定的端口,可以是1234等 sudo /usr/sbin/sshd -d -p 2222windows这边:端口号要一致 ssh -vvv ubuntusername192…...
Spring Cloud--从零开始搭建微服务基础环境【四】
😀前言 本篇博文是关于Spring Cloud–从零开始搭建微服务基础环境【四】,希望你能够喜欢 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,…...
FreeRTOS操作系统中,断言输出 Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,766 原因
分析:Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,766 出现这个原因表示,你现在系统某个中断的优先级高于FreeRTOS可管理的优先级范围,一旦你这个中断触发,断言的信息即你串口就会输出这个条语句(前提你串口…...
【Linux】进程间通信与同步
IPC进程间通信 无名管道pipe(血缘关系的进程)有名管道fifo (无血缘关系的进程)共享内存信号(开销小)消息队列信号量套接字 进程间同步 文件锁信号量...
SpringBoot 统一功能处理
目录 一、用户登录权限验证 1.1 SpringAOP可以进行处理吗? 1.2 创建自定义拦截器 1.3 将自定义拦截器配置到系统配置项中 1.4 拦截器的实现原理 1.4.1 实现原理源码分析 1.5 统一访问前缀添加 二、统一异常处理 2.1 为什么需要使用统一异常处理?…...
解决:sh: vite: command not found
文章目录 问题描述原因分析解决方案 问题描述 第一次pull项目,运行npm run dev时报错:sh: vite: command not found 原因分析 查看了package.json,发现是有vite的。 没有安装依赖导致的; 解决方案 执行npm i重新安装依赖&#…...
el-select下拉多选框 el-select 设置默认值不可删除功能
Element3.0vue3.0 el-select下拉多选框 el-select 设置默认值不可删除功能 Element-UI是一款广泛使用的Vue.js组件库,其中El-Select下拉多选框组件在实际项目开发中经常被使用。然而,在Element 3.0版本中,El-Select下拉多选框默认值可被删除&…...
Jetsonnano B01 笔记1:基础理解—网络配置—远程连接
今日开始学习 Jetsonnano B01,这是一台小电脑,可以用来: 运行现代 AI 负载,并行运行多个神经网络,以及同时处理来自多个高清传感器的数据,可广泛应用与图像分类、对象检测、图像分割、语音处 理等领域。它…...
Ubuntu系统信息查看指南:了解你的操作系统
要查看Ubuntu系统的信息,你可以使用一些命令行工具来获取系统的各种信息。以下是一些常用的命令: 1. lsb_release -a:列出Ubuntu版本号、发行代号和描述信息。 2. uname -a:显示Linux内核的版本信息。 3. lscpu:提供…...
【STM32】学习笔记-SPI通信
SPI通信 SPI通信(Serial Peripheral Interface)是一种同步的串行通信协议,用于在微控制器、传感器、存储器、数字信号处理器等之间进行通信。SPI通信协议需要使用4个线路进行通信:时钟线(SCLK)、主输入/主输出线(MISO)、主输出/主…...
解决vue项目首行报红( ESLint 配置)和新建的vue文件首行报红问题
目录 前情提要: 修改ESLint 配置 新建的vue文件首行还是报红 报红原因: 解决方法: 前情提要: 在网上查到的方法可能是在package.json文件或者.eslintrc.js文件中添加 requireConfigFile: false 如果此方法对你的错误不起作用…...
Linux 调试技术 Kprobe
目录 用途:一、技术背景1.1 kprobes的特点与使用限制1.2 kprobe原理 二、 基于kprobe探测模块的探测方式2.1、struct kprobe结构体2.2 kprobe API函数2.3 示例代码参考资料: 用途: 判断内核函数是否被调用,获取调用上下文、入参以…...
一文了解评估 K8s 原生存储产品需要关注的关键能力
近些年,越来越多的企业使用 Kubernetes(K8s)支持生产环境关键业务。这些业务往往对存储性能和稳定性具有更高的要求,传统存储方案难以充分满足,因此不少用户开始关注更契合 K8s 环境的 K8s 原生存储方案。 不过&#…...
安卓音频问题解决记录(一)
本文记录在安卓framework开发过程中遇到的一些音频问题的解决办法。 1.支持多应用同时录音(安卓10以上) 通过日志分析,发现当另一个应用打开录音的时候会被静音,日志如下: APM_AudioPolicyManager: setAppState(portId:43, state:2) APM_AudioPolicyManager: set…...
Windows系统盘空间告急?Driver Store Explorer帮你轻松清理冗余驱动,快速释放10GB+
Windows系统盘空间告急?Driver Store Explorer帮你轻松清理冗余驱动,快速释放10GB 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 你是否曾困惑于Windows系统盘空…...
CentOS7服务器流量飙升?别慌,用iftop+nload五分钟定位‘吃流量’的进程
CentOS7服务器流量飙升?五分钟精准定位异常进程的侦探手册 凌晨三点,手机突然响起刺耳的告警声——服务器流量激增300%。这不是演习,而是一场真实的运维战役。本文将带你化身"流量侦探",用iftop和nload这对黄金组合&…...
保姆级教学:用FUTURE POLICE和MySQL管理你的语音字幕数据
保姆级教学:用FUTURE POLICE和MySQL管理你的语音字幕数据 1. 为什么需要管理语音字幕数据? 想象一下这样的场景:你刚刚用FUTURE POLICE处理了100个会议录音,得到了精确到毫秒的字幕文件。这些文件散落在各个文件夹里,…...
太烧token了,我用Ai写了一个vscode的插件wps-editor(已开源)
这是一篇关于开源项目Wps-Editor的介绍文章,希望能让大家了解它的价值并支持其发展。 引言 在人工智能(AI)浪潮席卷各行各业的今天,大型语言模型(LLM)已成为内容创作者、办公人士、学生乃至研究者的得力助手。无论是撰写报告、分析数据、润色文案&#…...
原料杂乱难管理?合并功能一键搞定
在制造行业的日常运营中,进销存管理的核心痛点往往藏在细节里——尤其是生产环节的领料流程,却常常成为拖慢效率、造成损耗的“隐形绊脚石”。很多企业在生产计划落地时,都会遇到这样的困境:同一份生产计划单中,不同成…...
毕业设计作品精选【芳芯科技】酒驾检测座椅设计
实物效果图:实现功能:有人的情况下,单片机实时采集周围的酒精浓度,如果超出,蜂鸣器报警,LED闪烁。检测座位重量和检测人体发射的红外,两者都满足认为座位有人,否则无人。配有显示屏进…...
实战指南:基于快马AI生成代码,快速构建并部署一个完整企业网站
今天想和大家分享一个实战经验:如何用InsCode(快马)平台快速搭建一个完整的企业网站。整个过程非常流畅,特别适合需要快速上线展示页面的场景。 项目结构规划 首先明确企业网站需要的核心页面:首页、关于我们、服务项目、案例展示、团队介绍、…...
SecGPT-14B模型压力测试:验证OpenClaw高并发安全任务的稳定性
SecGPT-14B模型压力测试:验证OpenClaw高并发安全任务的稳定性 1. 测试背景与目标 最近在探索如何将OpenClaw与安全大模型结合,构建一个自动化安全分析助手。SecGPT-14B作为一款专注于网络安全的大模型,理论上可以处理端口扫描、日志分析等任…...
代码随想录算法训练营第二天 | Leetcode 209.长度最小的子数组 | Leetcode 59.螺旋矩阵 II | 区间和 | 开发商购买土地
209.长度最小的子数组 力扣题目链接:209. 长度最小的子数组 - 力扣(LeetCode)文档讲解:209.长度最小的子数组 | 滑动窗口 | 连续子数组 | 代码随想录视频讲解:拿下滑动窗口! | LeetCode 209 长度最小的子数…...
